Java流操作调用

tso*_*akp 14 java java-8 java-stream

任何人都可以指向官方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;
} 
Run Code Online (Sandbox Code Playgroud)

以上目前将调用check方法4次.

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

Eug*_*ene 15

这与流的源不相关,而是与流实现本身中完成的终端操作和优化有关.例如:

Stream.of(1,2,3,4)
      .map(x -> x + 1)
      .count();
Run Code Online (Sandbox Code Playgroud)

由于java-9,一次map不会执行.

要么:

 someTreeSet.stream()
            .sorted()
            .findFirst();
Run Code Online (Sandbox Code Playgroud)

sorted可能根本没有执行,因为源是a TreeSet并且获取第一个元素是微不足道的,但如果这是在流API中实现的,则是一个不同的问题.

所以真正的答案在这里 - 这取决于,但我无法想象一个操作将被执行更多的源数据元素.

  • "*但我无法想象一个操作会被执行得更多,源代码中的元素数量*" - 好吧,如果指定一个`Comparator`进行排序,它的`compare`肯定会被调用多次,而不是元素的数量,但这只是挑剔.+1 (2认同)
  • 根据我自己的数学4次;)我明白你的观点,我正在考虑使用flatMap的棘手用例,然后是过滤器.在这种假设的情况下,也许现实是反制的.让我试着找一个例子...... (2认同)