如何将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));