【问题标题】:How does anyMatch work in java stream in this example在此示例中,anyMatch 如何在 java 流中工作
【发布时间】:2020-06-25 23:33:10
【问题描述】:

这是我的代码:

Stream.of("d2", "a2", "b1", "b3", "c")
                .map(s -> {
                    System.out.println("map: " + s);
                    return s.toUpperCase();
                })
                .anyMatch(s -> {
                    System.out.println("anyMatch: " + s);
                    return ((String) s).startsWith("A");
                });

输出是:

map: d2
anyMatch: D2
map: a2
anyMatch: A2

我的问题是为什么第一个元素进入了流,而第三个和第四个没有?

感谢任何详细的解释。

【问题讨论】:

  • 您阅读过anyMatch 的文档吗?这些都有记录。

标签: java java-stream


【解决方案1】:

来自javadoc的文字:

返回此流的任何元素是否与提供的谓词匹配。如果不需要确定结果,则可能不会评估所有元素的谓词。如果流为空,则返回 false 并且不计算谓词。

这是一个短路操作,在遇到该元素时为真。

如果您想处理每个项目,请使用forEach

【讨论】:

    【解决方案2】:

    你的代码相当于:

    for (String s : new String[] {"d2", "a2", "b1", "b3", "c"}) {
        System.out.println("map: " + s);
        s = s.toUpperCase();
        System.out.println("anyMatch: " + s);
        if (((String) s).startsWith("A"))
            break;
    }
    

    "a2" 之后的元素由于 break 语句而未被处理。这被称为 short-circuiting,即它在到达终点之前中断循环(电路)(停止终点的 short)。

    anyMatch(...) 方法被记录为短路

    这是short-circuiting terminal operation

    链接指向这个解释:

    此外,一些操作被视为短路操作。如果在呈现无限输入时,中间操作可能会产生有限流,则它是短路的。如果一个终端操作在有无限输入时可能会在有限时间内终止,那么它就是短路的。在管道中进行短路操作是无限流处理在有限时间内正常终止的必要条件,但不是充分条件。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-10-30
      • 2017-09-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-20
      • 1970-01-01
      • 2021-08-11
      相关资源
      最近更新 更多