java8使用stream流的方法之Collectors.toMap()

Collectors.toMap()

 List<DeviceResult> a = new ArrayList<>(deviceResults.stream()
                .collect(Collectors.toMap(
                    deviceResult->Arrays.asList(deviceResult.getDeviceId(),deviceResult.getSampleNo(),deviceResult.getTestDate(),deviceResult.getBarcodeId()),
                    Function.identity(),
                    (existing, replacement) -> existing))
                .values());

首先我们来一个简单的 写法很好理解 将对象的一个属性作为key 对象作为value抽出来形成map,Function.identity()意思就是t -> t

 Map<String,TestItem> testItemMap = testItems.stream().collect(Collectors.toMap(TestItem::getCode,Function.identity()));

Collectors.toMap() 在 key 重复的时候会抛出一个 IllegalStateException 异常,加入第三个参数表示重复时会取第一个值
(existing, replacement) -> replacement):当出现key相同的情况时,新的value覆盖掉就得value;

 Map<String,TestItem> testItemMap = testItems.stream().collect(Collectors.toMap(TestItem::getCode,testItem->testItem), (v1, v2) -> v1));
### 解决 Java Stream 中 `Collectors.toMap` 的 Key 值重复问题 当使用 `Collectors.toMap()` 方法时,如果存在相同的键,则会抛出异常。为了避免这种情况并处理可能存在的重复键,可以通过提供合并函数来指定如何处理冲突。 #### 使用自定义合并逻辑 下面是一个例子展示了如何通过传递第三个参数作为合并函数来解决这个问题: ```java import java.util.*; import java.util.stream.Collectors; public class Main { public static void main(String[] args) { List<Item> items = Arrays.asList( new Item(1, "apple"), new Item(2, "banana"), new Item(1, "orange") // Duplicate key with different value ); Map<Integer, String> itemMap = items.stream() .collect(Collectors.toMap( Item::getId, Item::getName, (existing, replacement) -> existing + ", " + replacement // Merge function )); System.out.println(itemMap); } } class Item { private int id; private String name; public Item(int id, String name) { this.id = id; this.name = name; } public int getId() { return id; } public String getName() { return name; } } ``` 这段代码中,在遇到相同键的情况下,两个值会被连接成一个字符串[^1]。 #### 利用 `toMap` 的其他形式 另一种方式是利用带有四个参数版本的 `toMap` 收集器,其中最后一个参数用于创建映射实例。这使得可以选择不同的实现类如 `LinkedHashMap` 来保持插入顺序或选择更合适的哈希表结构[^2]。 ```java Map<Integer, String> itemMapWithCustomMapType = items.stream().collect( Collectors.toMap(Item::getId, Item::getName, (v1, v2) -> v1, LinkedHashMap::new)); ``` 这样不仅可以控制冲突解决方案还可以定制化最终返回的地图类型。 #### 处理复杂场景下的数据聚合 对于更加复杂的业务需求,比如想要收集所有的名称而不是简单地组合它们,可以考虑先分组再转换为所需的结果格式: ```java items.stream() .collect(Collectors.groupingBy(Item::getId)) .entrySet() .stream() .collect(Collectors.toMap(Map.Entry::getKey, e -> e.getValue().stream().map(Item::getName).toList())); ``` 这种方法首先按 ID 对项目进行分组,之后再次式处理这些分组并将每个列表中的名字提取出来形成新的映射关系。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值