您对减排的理解是错误的。
reduce将对所有元素重复应用一个函数以获得 单个结果 。
您似乎想像做还原
1, 2, 3, 5, 6, 8, 9, 10│ │ │ │ │ │ │ │└op┘ └op┘ └op┘ └op┘ │ │ │ │ result list
实际上,它确实
1, 2, 3, 5, 6, 8, 9, 10│ │ │ │ │ │ │ │└op┘ └op┘ └op┘ └op┘ │ │ │ │ └─op─┘ └─op─┘ │ │ └────op────┘│ final result value
尽管这是一个概念视图,但操作的确切顺序尚未指定。顺序执行将类似于
(((1 op 2) op 3) op4)…并行执行,而并行执行将类似于上面的树之类的执行和部分顺序执行。
reduce如果先将每个元素转换为a
List,然后使用将每个列表连接起来的list操作,则可能会滥用结果列表。但是,这样做有两个问题:
- 它没有提供所需的“跳过(原始列表的)第二个元素”逻辑;如果您看一下上面的树,应该清楚,不可能制定出
op
在每种可能的执行方案中都能做到的正确函数 - 创建临时列表并将其连接起来效率很低
可以通过使用来解决后一点
collect,这是 可变的
减少,因此,允许您使用可以在其中添加项目的可变列表,但是,它不能解决第一点,包括所需的过滤器将违反合同,并且仅按顺序执行工作。
因此,解决方案是为
filter源列表范围内的所有元素定义一个,然后使用进行可变归约以创建结果列表
collect,这很奇怪,这正是您的原始代码所做的:
… .filter(integer -> integer % 2 == 0).collect(Collectors.toList());



