我想使用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();
因为我需要根据特定的顺序执行一些计算。
答案 0 :(得分:1)
是的,您可以保证,因为流管道中的操作按照它们被声明的顺序应用(一旦执行了终端操作)。
来自Stream
docs:
要执行计算,流操作将组成一个流管道。流管道由源(可能是数组,集合,生成器函数,I / O通道等),零个或多个中间操作(将流转换为另一个流)组成,例如filter(Predicate))和终端操作(产生结果或副作用,例如count()或forEach(Consumer))。溪流很懒;源数据的计算仅在启动终端操作时执行,源元素仅在需要时使用。
上段中的关键字是管道,其definition in Wikipedia的开头如下:
在软件工程中,管道由一系列处理元素(进程,线程,协同程序,函数等)组成,这些元素的排列使得每个元素的输出都是下一个元素的输入......
答案 1 :(得分:0)
sorted
不仅会在map
之前应用sorted
,而且显然会遍历基础来源。 array
将获取所有元素,将它们放入ArrayList
或map
(取决于大小是否已知),对其进行排序,并且它们一次为{{1}提供一个元素操作。