[英]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
代替filter
, findFirst
:
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.