我有以下可以正常工作的代码
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()
要修复代码中的特定问题,您的 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如其他答案所示, 是更好的解决方案。
您可以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)
你可以做:
allClasses.stream()
.anyMatch(uc-> (uc.getClassDates().start().before(classEndDate)
&& uc.getClassDates().end().after(classBeginDate)));
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
180 次 |
| 最近记录: |