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

使用Stream合并含更新值的两个列表,求更优雅实现方式

更优雅的Stream合并方案

可以通过一次Stream操作完成合并,无需创建两个中间Map,利用Stream.concat合并两个流,并结合Collectors.toMap的合并规则处理重复项,直接得到最终结果。

实现代码

List<User> output = Stream.concat(users.stream(), updatedUsers.stream())
        .collect(Collectors.toMap(
                User::getId,
                Function.identity(),
                (oldUser, newUser) -> newUser // 重复id时保留更新后的用户
        ))
        .values()
        .stream()
        .toList();

方案优势

  • 减少中间对象:无需单独创建两个Map再执行putAll,一次流操作完成合并与去重更新
  • 逻辑更紧凑:合并规则(保留更新项)直接在toMap的合并函数中声明,可读性更强
  • 效率更优:避免了两次流收集+Map合并的额外开销

补充说明

如果需要保持原始列表中非重复项的顺序,可以改用LinkedHashMap来维持插入顺序:

List<User> output = Stream.concat(users.stream(), updatedUsers.stream())
        .collect(Collectors.toMap(
                User::getId,
                Function.identity(),
                (oldUser, newUser) -> newUser,
                LinkedHashMap::new // 保留插入顺序
        ))
        .values()
        .stream()
        .toList();

这样最终列表中,非重复的原始用户会保持在users中的顺序,更新后的用户会替换原来的位置(因为Stream.concat先处理原始流,再处理更新流,合并函数取后者)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 22:35:08