java Stream流 toMap()方法 key重复异常及解决方法
1.key重复异常的出现
list.stream().collect(Collectors.toMap(key, value));
这一段就是一个将list集合转换为map的语句,非常简单。
但是只有个弊端,当key重复的时候会抛出
IllegalStateException: Duplicate key (value值)
这样的一个异常。
那么这个异常是哪里来的了,看看下面的源码就知道了:
// toMap方法
public static <T, K, U> Collector<T, ?, Map<K,U>> toMap(Function<? super T, ? extends K> keyMapper,
Function<? super T, ? extends U> valueMapper) {
return toMap(keyMapper, valueMapper, throwingMerger(), HashMap::new);
}
可以看到他掉用了throwingMerger()
这样一个方法来处理key重复的情况,那这个方法干了什么了?
// 默认key 重复处理
private static <T> BinaryOperator<T> throwingMerger() {
return (u,v) -> { throw new IllegalStateException(String.format("Duplicate key %s", u)); };
}
看到这里我想大家应该明白那个异常是哪里来的了吧,所以需要我们自己去实现key重复的逻辑,
toMap()方法是有第三个参数的
public static <T, K, U>
Collector<T, ?, Map<K,U>> toMap(Function<? super T, ? extends K> keyMapper,
Function<? super T, ? extends U> valueMapper,
BinaryOperator<U> mergeFunction) {
return toMap(keyMapper, valueMapper, mergeFunction, HashMap::new);
}
mergeFunction 这个参数就是一个处理重复冲突的函数
list.stream().collect(Collectors.toMap(key, value, (a, b) -> {
// 处理重复冲突的具体逻辑
}));
写法大概就是这样
今天就到这里,继续加油!