Java 8: الطريقة المفضلة لحساب تكرارات لامدا؟



Answers

كبديل لمزامنة المزامنة يمكن استخدام AtomicInteger صفيف عدد صحيح بدلاً من ذلك. طالما أن الإشارة إلى المصفوفة لا تحصل على مصفوفة أخرى معينة (وهذه هي النقطة) ، فيمكن استخدامها كمتغير نهائي بينما يمكن أن تتغير قيم الحقول بشكل تعسفي.

    int[] iarr = {0}; // final not neccessary here if no other array is assigned
    stringList.forEach(item -> {
            iarr[0]++;
            // iarr = {1}; Error if iarr gets other array assigned
    });
Question

أواجه نفس المشكلة في كثير من الأحيان. أحتاج إلى حساب عدد دورات لامدا للاستخدام خارج لامبدا. على سبيل المثال:

myStream.stream().filter(...).forEach(item->{ ... ; runCount++);
System.out.println("The lambda ran "+runCount+"times");

المشكلة هي أن runCount يجب أن يكون نهائيًا ، لذا لا يمكن أن يكون int. لا يمكن أن يكون عدد صحيح لأن هذا غير قابل للتغيير. يمكنني جعله متغير مستوى الصف (أي حقل) ولكن سأحتاج فقط في هذا الكود من التعليمات البرمجية. أعلم أن هناك العديد من الطرق ، فأنا أشعر بالفضول ما هو الحل المفضل لديك لهذا؟ هل تستخدم AtomicInteger أو مرجع صفيف أو طريقة أخرى؟




هناك طريقة أخرى للقيام بذلك (مفيدة إذا كنت ترغب في زيادة عدد mapToInt() فقط في بعض الحالات ، كما لو كانت العملية ناجحة) هي شيء من هذا القبيل ، وذلك باستخدام mapToInt() و sum() :

int count = myStream.stream()
    .filter(...)
    .mapToInt(item -> { 
        foo();
        if (bar()){
           return 1;
        } else {
           return 0;
    })
    .sum();
System.out.println("The lambda ran " + count + "times");

كما لاحظ ستيوارت ماركس ، لا يزال هذا الأمر غريبًا بعض الشيء ، لأنه لا يتجنب الآثار الجانبية تمامًا (اعتمادًا على ما يفعله foo() bar() ).

وهناك طريقة أخرى لزيادة المتغير في لامدا التي يمكن الوصول إليها خارجها وهي استخدام متغير صنف:

public class MyClass {
    private int myCount;

    // Constructor, other methods here

    void myMethod(){
        // does something to get myStream
        myCount = 0;
        myStream.stream()
            .filter(...)
            .forEach(item->{
               foo(); 
               myCount++;
        });
    }
}

في هذا المثال ، قد لا يكون استخدام متغير صنف لعنصر في طريقة واحدة منطقيًا ، لذلك يجب الحذر منه ما لم يكن هناك سبب وجيه لذلك. يمكن أن يكون الحفاظ على متغيرات الصف final إذا أمكن مفيدة من حيث سلامة الخيط ، إلخ. (راجع http://www.javapractices.com/topic/TopicAction.do?Id=23 للاطلاع على مناقشة حول الاستخدام final ).

للحصول على فكرة أفضل عن سبب عمل اللامباد بالطريقة التي يعمل بها ، https://www.infoq.com/articles/Java-8-Lambdas-A-Peek-Under-the-Hood لديه نظرة تفصيلية.






Related