java-8 - 为什么需要在管道中进行短路操作...在 Java 8 中

标签 java-8 java-stream

我读了这个 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/

    相关文章:

    java - 如果元素之和大于 Integer.MAX_VALUE,我们可以使用 IntStream#sum 吗?

    Java 8 - 永久代支持 - 替代方案

    java - summarizingInt 和 Collectors.summarizingInt 之间的区别?

    java - 在 Java 8 默认接口(interface)方法上使用 Spring @Transactional 注释是否安全?

    java - lambda 表达式和实例化方法引用之间的不同行为

    java - 在 Collection<A> 中获取 max(A.x) 的最简洁方法

    java - 按 Java Streams 中的字段分组

    java - 将 Stream<T> 映射到正在计数的 Map<T, Long>?

    java - 如何流式传输并获取所需格式类型的对象

    java - 通过流从其他 map 收集 map