如何将for循环转换为Java流来查找第一个引用?

如何将for循环转换为Java流来查找第一个引用?,java,java-stream,Java,Java Stream,我有下面的代码在功能上正常工作 for (UniversityClass class : allClasses) { Period<Date> classDate = class.getClassDates(); if (classDate.start().before(classEndDate) && classDate.end().after(classBeginDate))

我有下面的代码在功能上正常工作

for (UniversityClass class : allClasses)
    {
        Period<Date> classDate = class.getClassDates();
        if (classDate.start().before(classEndDate)
                && classDate.end().after(classBeginDate))
        {
            classBooked = true;
            break;
        }
    }
for(大学班级:所有班级)
{
期间classDate=class.getClassDates();
如果(classDate.start())早于(classEndDate)
&&classDate.end().after(classBeginDate))
{
classBooked=true;
打破
}
}
我试过这个:

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

            return true;
        }).findFirst().ifPresent($ -> {
            classBooked = true;
        });
allClasses.stream().filter(类->{
期间classDate=class.getClassDates();
如果(classDate.start())早于(classEndDate)
&&classDate.end().after(classBeginDate))
返回true;
}).findFirst().ifPresent($->{
classBooked=true;
});
但这需要添加一个return语句。另外,
classBooked
变量需要声明为final,但不能这样做。 犯了什么错误

而且,一旦是真的,我就需要从中中断。这就是我考虑添加findFirst()的原因。ifPresent()可以执行以下操作:

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

要解决代码中的特定问题,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();
final boolean classbook=allClasses.stream()
.过滤器(c->{
最后一个期间classDate=c.getClassDates();
在(classEndDate)之前返回classDate.start()
&&classDate.end().after(classBeginDate)
})
.findFirst().isPresent();

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

您可以使用
anyMatch
代替
过滤器
findFirst

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

如果条件的计算结果为false,则过滤函数返回什么?Lambda body是一种方法。具体来说,
谓词
(在
filter()
中使用的谓词)必须返回
布尔值
,并且您的实现只返回
,从不返回
。你应该解决这个问题。至于最后一点,lambda确实不允许分配给外部定义的变量。但是请注意,
Optional
启用了
isPresent()
,这非常好。而且,两个代码示例都不编译,因为
class
是保留关键字。不需要定义临时变量。
Period classDate=c.getClassDates()@HadiJ不需要,但由于使用了两次,因此更加紧凑。@HadiJ当然可以,但是布尔表达式会稍微长一些…@HadiJ最好只获取一次类日期,因为根据我的经验,javac不会优化对getter的多个调用,getter可以做任何事情。因此,引入变量以减少调用计数并使其更具可读性是值得的。@Ackdari这就是为什么我定义了第二种形式的流!
classBooked = allClasses.stream()
                        .map(UniversityClass::getClassDates)
                        .anyMatch(d -> d.start().before(classEndDate) && d.end().after(classBeginDate));