【问题标题】:Java stream operation invocationsJava 流操作调用
【发布时间】:2018-11-09 23:32:30
【问题描述】:

任何人都可以指向一个官方 Java 文档,该文档描述了 Stream 将为每个元素调用每个“非干扰和无状态”中间操作的次数。

例如:

Arrays.asList("1", "2", "3", "4").stream()
        .filter(s -> check(s))
        .forEach(s -> System.out.println(s));

public boolean check(Object o) {
    return true;
} 

上面目前会调用check方法4次。

在当前或未来版本的 JDK 中,check 方法的执行次数是否可能多于或少于从 List 或任何其他标准 Java API 创建的流中元素的数量 ?

【问题讨论】:

  • 这个问题背后有什么动机吗?比如,你想添加像 verify(times(4)).check(anyBool) 这样的单元测试,这样它以后就不会失败?
  • 我看不出为什么 stream 会返回超过 4 的值?
  • 动机是,如果 check 也对每个元素进行重要处理,那么我想确保它只对流中的每个元素执行一次。
  • @chrylis。我认为这不会有什么不同。

标签: java java-8 java-stream


【解决方案1】:

这与流的来源无关,而是在流实现本身中完成的终端操作和优化。例如:

Stream.of(1,2,3,4)
      .map(x -> x + 1)
      .count();

由于 java-9,map 将不会被执行一次。

或者:

 someTreeSet.stream()
            .sorted()
            .findFirst();

sorted 可能根本不会被执行,因为源是 TreeSet 并且获取第一个元素是微不足道的,但如果这在流 API 中实现,那就是另一个问题了。

所以这里的真正答案 - 这取决于,但我无法想象一个操作会比源中的元素数量更多地执行。

【讨论】:

  • "但我无法想象执行的操作会比源中的元素数量更多" - 好吧,如果您指定 Comparator 进行排序,它的compare 肯定会被调用的次数超过元素的数量,但这只是吹毛求疵。 +1
  • @Fureeish 不不,非常好的挑剔,确实你是对的;但似乎sorted 是唯一可以做到这一点的人。 distinct 不举例
  • 前段时间我向this question询问了关于jdk8 flatMap的问题(另见this related question)。简而言之,在 jdk8&9 中,flatMap 并不是完全惰性的,元素可以访问多次,而在 jdk10 中,此行为已得到修复。
  • @FedericoPeraltaSchaffner 如前所述,我可以将其写为Stream.of(1, 1) .flatMap(x -> Stream.of(x, x)) .forEach(System.out::println);,这是否意味着它被多次访问?
  • 根据我自己的数学计算 4 次 ;) 我明白你的意思,我在考虑使用 flatMap 的棘手用例,然后是过滤器。在这种假设的情况下,也许现实是违反直觉的。让我试着找个例子……
【解决方案2】:

来自the documentation

偷懒。许多流操作,例如过滤、映射或重复删除,可以延迟实现,从而为优化提供机会。例如,“查找具有三个连续元音的第一个字符串”不需要检查所有输入字符串。流操作分为中间(流产生)操作和终端(产生价值或副作用)操作。中间操作总是惰性的。

由于这个优点,因为filter 是一个中间操作,它会创建一个新的Stream 作为其操作的一部分,由于它的惰性,它只会每次调用过滤谓词一次元素作为其重建流的一部分。

您的方法可能在流中对其进行不同数量的调用的唯一方法是,如果流在状态之间以某种方式发生了变异,考虑到流中实际上没有任何东西运行直到 终端操作,实际上只有由于上游的错误才可能。

【讨论】:

  • 那么“懒惰”在 Java 流中是什么意思呢?对我来说,这意味着中间操作的实际调用将在调用终端操作之后发生。但它不保证每个元素只会调用一次中间操作(或根本不调用,具体取决于终端操作)。
猜你喜欢
  • 1970-01-01
  • 2017-07-22
  • 2016-10-09
  • 1970-01-01
  • 1970-01-01
  • 2019-04-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多