Java Stream如何通过Collector实现偶数在前升序、保留奇数原序
目标逻辑实现方案
你现有代码已经完成了按奇偶分组的基础逻辑,只需要在分组收集的基础上,搭配下游收集器完成列表处理、拼接全流程,完全可以用链式流实现紧凑的单行核心逻辑,不需要额外写零散的步骤代码。
关键实现要点
- 保持原有分组规则不变:以
integer -> integer % 2 != 0为分组键,偶数归入false键、奇数归入true键 - 偶数组处理:对
false键对应的列表做自然升序排序 - 奇数组处理:直接复用分组时收集的列表,完全保留元素在原输入中的相对顺序,不做任何重排
- 最终拼接:按偶数组在前、奇数组在后的顺序,把两个列表扁平拼接为最终结果
可直接运行的紧凑版代码
List<Integer> result = Arrays .stream(bf.readLine().split("\\s+")) .map(Integer::parseInt) .collect(Collectors.collectingAndThen( Collectors.groupingBy(integer -> integer % 2 != 0), groupedMap -> Stream.concat( groupedMap.getOrDefault(Boolean.FALSE, List.of()).stream().sorted(), groupedMap.getOrDefault(Boolean.TRUE, List.of()).stream() ).toList() )); // 按空格分隔格式打印最终结果 System.out.println(result.stream().map(String::valueOf).collect(Collectors.joining(" ")));
效果验证
拿示例输入1 6 2 3 4 5做测试:
- 分组阶段自动收集得到原始分组结果:
{false=[6, 2, 4], true=[1, 3, 5]} - 偶数组经升序排序后变为
[2, 4, 6],奇数组因没有经过排序操作,完全保持原收集顺序[1, 3, 5] - 拼接后得到最终序列
[2, 4, 6, 1, 3, 5],和预期完全一致
注意:
groupingBy默认的下游收集器为toList(),会严格按照流的遍历顺序收集元素,因此奇数组的元素顺序和输入顺序完全一致,不会出现重排,刚好满足奇数保序的要求。
内容的提问来源于stack exchange,提问作者unknownerror
相关产品推荐
相关产品推荐

