使用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
相关产品推荐
相关产品推荐

