【发布时间】:2018-01-27 09:59:28
【问题描述】:
给定三个这样的函数:
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(),因为第一个表达式返回 true。这是一个很好的优化。
现在,如果我使用 Streams 以函数式风格编写相同的代码,
if( Stream.of(abc(), def(), ghi()).anyMatch(integer -> integer.get() > 5)) {
.........
}
我认为同样会发生,即只会调用 abc()。但它调用了所有三个函数。有anyMatch()的时候检查其他两个函数不是多余吗?
noneMatch()的情况相同;流通过整个流。我只是想知道:即使在第一个元素处满足条件,遍历整个流(特别是如果流有很多值)真的不是一件坏事吗?
【问题讨论】:
-
当您执行
Stream.of(abc(), def(), ghi())时,您正在调用 3 个方法 -
感谢@Holger。等待使用 Java 9 :D
标签: java-8 java-stream