【Collectors.toMap key重复会报错】Collectors.toMap Duplicate key 1
报错信息
Collectors.toMap Duplicate key 1
看源码发现,默认mergeFunction使用的throwingMerger()
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遇到重复就直接报错了
private static <T> BinaryOperator<T> throwingMerger() {
return (u,v) -> { throw new IllegalStateException(String.format("Duplicate key %s", u)); };
}
所以需要自定义mergeFunction
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);
}
解决方案:
如果有重复的选择第一个,示例代码如下
Collectors.toMap(value -> value.getTest(), value -> value, (key1, key2) -> key1)
大家可以结合自己的业务场景去选择默认的报错、选择第一个或最后一个