如何使用Java Stream将对象列表转换为对象映射?
用Java Stream实现列表到映射的转换
原代码的核心逻辑是以订单ID为键构建OrderData对象的映射,规则如下:
- 若映射中无对应订单ID,直接存入当前订单
- 若映射中已有对应订单ID,仅当当前订单的文件列表不为空时,用当前订单覆盖原有值
用Java Stream结合Collectors.toMap可以实现完全等价的逻辑,代码如下:
List<OrderData> orderList = getOrderList(); Map<String, OrderData> orders = orderList.stream() .collect(Collectors.toMap( OrderData::getOrderID, Function.identity(), // 等价于order -> order,直接使用当前订单作为value (existing, newOrder) -> newOrder.getFiles().isEmpty() ? existing : newOrder ));
逻辑说明
Collectors.toMap的第一个参数指定映射的key提取规则(订单ID)- 第二个参数指定映射的value(直接使用订单对象本身,
Function.identity()是order -> order的简写) - 第三个参数是key冲突合并函数:当遇到重复订单ID时,判断新订单的文件列表是否为空,非空则用新订单覆盖原有值,否则保留原有订单,和原代码逻辑完全一致
内容的提问来源于stack exchange,提问作者Kon
相关产品推荐
相关产品推荐

