是否在Java Streams中映射之前应用了排序?

时间:2017-07-10 17:01:08

标签: java java-stream

我想使用Java流处理List,但不确定我是否可以保证sort方法在以下表达式中的map方法之前处理:

list.stream()
            .sorted((a, b) -> b.getStartTime().compareTo(a.getStartTime()))
            .mapToDouble(e -> {
                        double points = (e.getDuration() / 60);
                        ...                             
                        return points * e.getType().getMultiplier();
                    }
            ).sum();

因为我需要根据特定的顺序执行一些计算。

2 个答案:

答案 0 :(得分:1)

是的,您可以保证,因为流管道中的操作按照它们被声明的顺序应用(一旦执行了终端操作)。

来自Stream docs

  

要执行计算,流操作将组成一个流管道。流管道由源(可能是数组,集合,生成器函数,I / O通道等),零个或多个中间操作(将流转换为另一个流)组成,例如filter(Predicate))和终端操作(产生结果或副作用,例如count()或forEach(Consumer))。溪流很懒;源数据的计算仅在启动终端操作时执行,源元素仅在需要时使用。

上段中的关键字是管道,其definition in Wikipedia的开头如下:

  

在软件工程中,管道由一系列处理元素(进程,线程,协同程序,函数等)组成,这些元素的排列使得每个元素的输出都是下一个元素的输入......

答案 1 :(得分:0)

sorted不仅会在map之前应用sorted,而且显然会遍历基础来源。 array将获取所有元素,将它们放入ArrayListmap(取决于大小是否已知),对其进行排序,并且它们一次为{{1}提供一个元素操作。