如何转换 for 循环以找到 Java 流的第一次出现?

eva*_*van 14 java java-stream

我有以下可以正常工作的代码

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

我试过这个:

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

            return true;
        }).findFirst().ifPresent($ -> {
            classBooked = true;
        });
Run Code Online (Sandbox Code Playgroud)

但这会引发添加 return 语句。此外,该classBooked变量需要声明为 final,但这是不可能的。正在做的错误是什么?

此外,一旦为真,我就需要break从它。这就是为什么我想到添加 findFirst().ifPresent()

Kon*_*lph 8

要修复代码中的特定问题,您的 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();
Run Code Online (Sandbox Code Playgroud)

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


Jea*_*nès 8

您可以anyMatch代替filter, 使用findFirst:

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

您也可以使用map稍微更具可读性:

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


Had*_*i J 6

你可以做:

allClasses.stream()
          .anyMatch(uc-> (uc.getClassDates().start().before(classEndDate)
                              && uc.getClassDates().end().after(classBeginDate)));
Run Code Online (Sandbox Code Playgroud)