栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

Java 8中的throwingMerger的替代方法

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Java 8中的throwingMerger的替代方法

throwingMerger()
实施如下

private static <T> BinaryOperator<T> throwingMerger() {    return (u,v) -> { throw new IllegalStateException(String.format("Duplicate key %s", u)); };}

您可以在代码库中添加类似的方法,但是您应该了解该合并的基本问题:异常消息不正确。该函数的第一个参数是旧值,而不是键。该功能无法使用该键,因此对于此合并功能,不可能生成包含重复键的异常消息。

因此,由于不可能在此位置解决此问题,因此最好将此函数作为实现细节,因此可以在没有任何兼容性约束的情况下将其删除以用于Java 9。

为了提供合理的诊断,

toMap
不使用合并功能
toMap
与(使用非抛出)合并功能需要完全不同的实现,因此不使用合并功能的
toMap
and
toConcurrentMap
收集器已被完全重写。

要求使用throwing
merge函数的常见原因是,没有合并功能的情况下,没有任何

toMap
重载接受映射
Supplier
。但是,由于抛出合并将不会做正确的事,并且当应该拒绝重复密钥时,需要一种完全不同的方法,因此您可以使用此答案的收集器。它的一个稍微改进的版本是

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));}


转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/569457.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号