的throwingMerger()
如下
private static <T> BinaryOperator<T> throwingMerger() {
return (u,v) -> { throw new IllegalStateException(String.format("Duplicate key %s", u)); };
}
你可以添加一个类似的方法来你的代码库,但你应该知道,合并的根本问题的实施。该函数的第一个参数是旧值,而不是关键。此功能无法使用该密钥,因此无法为此合并功能生成包含重复密钥的异常消息。
因此,由于在这个地方解决这个问题是不可能的,所以这个函数是一个实现细节是很好的,所以它可以在没有任何兼容性限制的情况下被移除。
为了提供一个合理的诊断,而不toMap
合并功能需要一个完全不同的实施比toMap
用(非抛)合并功能,所以toMap
和toConcurrentMap
收集器没有合并功能已被完全重写。
请求投掷合并功能的常见原因是没有toMap
超载接受没有合并功能的地图Supplier
。但由于投掷合并不会做正确的事情,当重复的键应该被拒绝时需要完全不同的方法,您可以使用this answer的收集器来代替。它的一个稍微改进的版本是
public static <T, K, V, M extends Map<K,V>> Collector<T, ?, M> toMap(
Function<? super T, ? extends K> keyMapper,
Function<? super T, ? extends V> valueMapper,
Supplier<M> mapSupplier) {
return Collector.of(mapSupplier,
(m,t) -> putUnique(m, keyMapper.apply(t),
Objects.requireNonNull(valueMapper.apply(t))),
(m1,m2) -> {
if(m1.isEmpty()) return m2;
if(!m2.isEmpty()) m2.forEach((k,v) -> putUnique(m1, k, v));
return m1;
});
}
private static <K, V> void putUnique(Map<K, V> map, K key, V v1){
V v2 = map.putIfAbsent(key, v1);
if(v2 != null) throw new IllegalStateException(
String.format("Duplicate key %s (values %s and %s)", key, v1, v2));
}
这并不是真的那么难写自己。我已经写了几十次(尽管我宁愿我没有,但那是另一回事)。 –
'(a,b) - > {throw new IllegalStateException(); }'有整个合并函数。 –
javadoc没有过期。它正确地声明该方法可以被其他类的方法用于描述的目的。如果您查看[* generated * javadoc](https://docs.oracle.com/javase/8/docs/api/java/util/stream/Collectors.html#method.summary),而不是源代码,则您你会发现这个方法甚至不存在。 javadoc不适用于您,但适用于JDK开发人员。 – Andreas