我试图将foreach转换为流
for (Entity entity : listOfEntitys.getAll()) {
if (!isEntityDateValid(entity.getStartDate())
|| !isEntityDateValid(entity.getEndDate())) {
return false;
}
}
所以我像这样转换它
if (listOfEntitys.getAll() != null) {
return listOfEntitys.getAll().stream().anyMatch(entity-> !isEntityDateValid(entity.getStartDate())
|| !isEntityDateValid(entity.getEndDate()));
}
但我搞砸了,因为它总是评估布尔值,我只想在满足条件时返回它
答案 0 :(得分:3)
如果您只想在特定条件下进行返回,则您的stream命令将需要成为if
语句的一部分。
if (listOfEntities.getAll()!=null && listOfEntities.getAll().stream().anyMatch(...)) {
return false;
}
但使用!allMatch(X && Y)
而不是anyMatch(!X || !Y)
可能会更清楚。
if (listOfEntities.getAll()!=null
&& !listOfEntities.getAll().stream()
.allMatch(entity -> isEntityDateValid(entity.getStartDate())
&& isEntityDateValid(entity.getEndDate()))) {
return false;
}
答案 1 :(得分:0)
如果任何条目与您的条件相符,那么{} {}会anyMatch
返回true
:
return listOfEntitys.getAll().stream().anyMatch(entity-> !isEntityDateValid(entity.getStartDate())
|| !isEntityDateValid(entity.getEndDate()));
所以添加一个不在那里:
return !listOfEntitys.getAll().stream().anyMatch(entity-> !isEntityDateValid(entity.getStartDate())
|| !isEntityDateValid(entity.getEndDate()));
答案 2 :(得分:0)
所以看起来你有一个for
循环,如果所有日期都有效,会返回true,或者只要一个,就会返回false。
return true
遗失了,但我想它就在那里,否则你的初步翻译就没有意义了。
实现此目的的正确方法是使用allMatch()
,这是最准确地传达循环含义的方法:
return listOfEntitys.getAll().stream()
.allMatch(e -> isEntityDateValid(e.getStartDate) || isEntityDateValid(e.getEndDate()));
当且仅当所有实体都有有效日期时,这将返回true。只要一个无效,它就会返回false。就像你的for
循环一样。
这还有一个额外的好处,即避免负面条件,这是使代码更清晰的规则之一。