给定以下三个函数:
private Optional<Integer> abc() {
return Optional.of(6);
}
private Optional<Integer> def() {
return Optional.of(3);
}
private Optional<Integer> ghi() {
return Optional.of(9);
}
如果我想检查这三个函数之一是否返回大于5的内容(当然是包装在Optional中的),在传统命令式风格下,我会像这样处理:
if( abc().get() > 5 || def().get() > 5 || ghi().get() > 5) {
......// Do something
} // I am not doing get() without checking ifPresent() just for simplicity sake
这种方法只会进入
abc()
函数并跳过 def()
和 ghi()
,因为第一个表达式返回真值。这是一种很好的优化。
现在如果我使用流(Streams)以函数式编程风格编写相同的代码,if( Stream.of(abc(), def(), ghi()).anyMatch(integer -> integer.get() > 5)) {
.........
}
我原本以为只会调用
abc()
函数,但实际上三个函数都被调用了。既然使用了 anyMatch()
方法,检查其他两个函数是否满足条件是不是多余的呢?同样道理,在使用
noneMatch()
时也是这样,整个 Stream 都会被遍历。我想知道的是:即使在第一个元素满足条件的情况下,遍历整个 Stream(特别是 Stream 中有很多值的情况下)是否真的是一件坏事?
Stream.of(abc(), def(), ghi())
时,你正在调用这三个方法。 - fps