我读了这个 api 文档 Stream api它说(一个段落中的三个句子)
“如果中间操作在呈现无限输入时可能会产生有限流,则它是短路的。”
“如果终端操作在无限输入时可能在有限时间内终止,则它是短路的。”
“在管道中进行短路操作是无限流处理在有限时间内正常终止的必要条件,但不是充分条件。”
如果有人通过代码示例帮助我理解,那就太好了。
我对短路的了解就像
例如,
if( a && b ) { ... }
如果 a 为假,则不必检查 b。
最佳答案
I don't understand why intermediate and terminal operations are short-circuiting if, when presented with infinite input.
因为它声明“如果在呈现无限输入时 可能产生有限流,则中间操作是短路的结果 。”
示例:
limit()
如果它的输入是无限流,则输出是有限的,因此没有必要尝试消耗所有输入,因此它是短路的,因为即使输入无法在有限时间内处理,它也会在有限时间内产生输出.Stream<Integer> infiniteStream = Stream.iterate(0, i -> i + 1);
infiniteStream.limit(5).forEach(System.out::println);
即使无限流是无限的,也会产生输出并在有限时间内终止。
I don't understand third sentence as well why short-circuiting is necessary but insufficient condition for processing infinite stream to terminate normally in finite time.
句子是:“在管道中进行短路操作是无限流处理在有限时间内正常终止的必要条件,但不是充分条件。”
示例:
anyMatch
是一个短路终端操作,但在无限流上产生结果 只有如果输入流的元素验证谓词。Stream<Integer> infiniteStream = Stream.iterate(0, i -> i);
infiniteStream.anyMatch(x->x==1).forEach(System.out::println);
不会终止,但:
Stream<Integer> infiniteStream = Stream.iterate(0, i -> i);
infiniteStream.anyMatch(x->x==0).forEach(System.out::println);
做。
逻辑表达式中的短路是另一种短路,但您可以考虑在表达式中会发生什么,例如
if (f() && g())
与 f
和/或 g
有无限计算... 问题:表达式什么时候可以有值?如 f()
生产 false
那么即使 g()
是一个无限计算,表达式等于 false。然后以某种方式,&&
可以缩短一些无限的计算。
关于java-8 - 为什么需要在管道中进行短路操作...在 Java 8 中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46349179/