You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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做测试:

  1. 分组阶段自动收集得到原始分组结果:{false=[6, 2, 4], true=[1, 3, 5]}
  2. 偶数组经升序排序后变为[2, 4, 6],奇数组因没有经过排序操作,完全保持原收集顺序[1, 3, 5]
  3. 拼接后得到最终序列[2, 4, 6, 1, 3, 5],和预期完全一致

注意:groupingBy默认的下游收集器为toList(),会严格按照流的遍历顺序收集元素,因此奇数组的元素顺序和输入顺序完全一致,不会出现重排,刚好满足奇数保序的要求。

内容的提问来源于stack exchange,提问作者unknownerror

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.23 12:15:03