JAVA Foreach to Stream

时间:2017-02-20 12:10:25

标签: java foreach java-8 java-stream

我试图将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()));
    }

但我搞砸了,因为它总是评估布尔值,我只想在满足条件时返回它

3 个答案:

答案 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循环一样。

这还有一个额外的好处,即避免负面条件,这是使代码更清晰的规则之一。