【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)

大家可以结合自己的业务场景去选择默认的报错、选择第一个或最后一个