簡體   English   中英

如何將 for 循環轉換為 Java 流的第一次出現?

[英]How to convert a for-loop to find the first occurrence to Java streams?

我有以下功能正常的代碼

for (UniversityClass class : allClasses)
    {
        Period<Date> classDate = class.getClassDates();
        if (classDate.start().before(classEndDate)
                && classDate.end().after(classBeginDate))
        {
            classBooked = true;
            break;
        }
    }

我試過這個:

allClasses.stream().filter(class -> {
            Period<Date> classDate = class.getClassDates();
            if (classDate.start().before(classEndDate)
                && classDate.end().after(classBeginDate))

            return true;
        }).findFirst().ifPresent($ -> {
            classBooked = true;
        });

但這會引發添加返回語句。 此外, classBooked變量需要聲明為 final,但不能這樣做。 正在做的錯誤是什么?

此外,一旦屬實,我需要break它。 這就是為什么我想添加 findFirst().ifPresent()

要修復代碼中的特定問題,您的 lambda始終需要返回一個值,並且需要將ifPresent更改為isPresent

final boolean classBooked = allClasses.stream()
        .filter(c -> {
            final Period<Date> classDate = c.getClassDates();
            return classDate.start().before(classEndDate)
                && classDate.end().after(classBeginDate)
        })
        .findFirst().isPresent();

但是,如其他答案所示, anyMatch是更好的解決方案。

您可以使用anyMatch代替filterfindFirst

classBooked = allClasses.stream()
                        .anyMatch(c -> {
                            Period<Date> classDate = c.getClassDates();
                            return (classDate.start().before(classEndDate) && classDate.end().after(classBeginDate));
                        });

您也可以使用map來提高可讀性:

classBooked = allClasses.stream()
                        .map(UniversityClass::getClassDates)
                        .anyMatch(d -> d.start().before(classEndDate) && d.end().after(classBeginDate));

你可以做:

allClasses.stream()
          .anyMatch(uc-> (uc.getClassDates().start().before(classEndDate)
                              && uc.getClassDates().end().after(classBeginDate)));

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM