Java 8中throwMerger的替代方案
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了Java 8中throwMerger的替代方案,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1915字,纯文字阅读大概需要3分钟。
内容图文
![Java 8中throwMerger的替代方案](/upload/InfoBanner/zyjiaocheng/735/52c749eb1a6441f6b2b438f045c0e6f3.jpg)
我正在实现使用合并功能的自己的收集器.不幸的是,对于我的一些情况,我不能重用抛出IllegalStateException的以下JDK合并函数.
java.util.stream.Collectors#throwingMerger
它发生的原因是它具有私有访问修饰符,并且来自其他(非内部)类的访问受到限制.
但是,javadoc说:
This can be used to enforce the assumption that the elements being collected are distinct
但是,正如我所见,java doc已经过时了.它不能使用.问题是JDK是否为java开发人员提供类似功能(类似方法,常量等),或者应该自己编写?
解决方法:
throwMerger()实现如下
private static <T> BinaryOperator<T> throwingMerger() {
return (u,v) -> { throw new IllegalStateException(String.format("Duplicate key %s", u)); };
}
您可以在代码库中添加类似的方法,但是您应该知道该合并的基本问题:异常消息不正确.该函数的第一个参数是旧值,而不是键.密钥不可用于此函数,因此生成包含重复键的异常消息对于此合并功能是不可能的.
因此,由于在这个地方修复这个问题是不可能的,所以这个函数是一个实现细节是很好的,因此可以在没有任何兼容性限制的情况下删除Java 9.
为了提供合理的诊断,没有合并函数的toMap需要一个完全不同于带有(非抛出)合并函数的map的实现,因此没有合并函数的toMap和toConcurrentMap收集器已被完全重写.
要求抛出合并功能的一个常见原因是没有toMap过载接受没有合并功能的地图供应商.但是,由于投掷合并不会做正确的事情,并且当重复键被拒绝时需要完全不同的方法,您可以使用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));
}
内容总结
以上是互联网集市为您收集整理的Java 8中throwMerger的替代方案全部内容,希望文章能够帮你解决Java 8中throwMerger的替代方案所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。