我正在实现自己的使用 合并功能 的收集器。不幸的是,对于我的某些情况,我无法重用抛出 IllegalStateException
的以下JDK合并函数。
java.util.stream.Collectors#throwingMerger
发生这种情况是因为它具有 私有 访问修饰符,并且限制了其他(而非内部)类的访问。但是,javadoc表示以下内容:
这可以用来执行以下假设:所收集的元素是不同的
但是,正如我所看到的,java
doc已经过时了。无法使用。问题是JDK是否为Java开发人员提供了对类似功能的访问(类似方法,常量等),还是应该由他们自己编写?
该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));
}
这可以用来强制假设所收集的元素是不同的 但是,在我看来,java doc已经过时了。不能用了。问题是JDK是否为java开发人员提供了对类似功能的访问(类似的方法、常量等),还是应该由开发人员自己编写?
我一直在通过Netbeans使用CodeNameOne设计一个应用程序,并遇到了一些问题,特别是“找不到符号”编译错误。经过进一步的研究,我发现这是由于CNO不支持某些库/杂项。 我想知道是否有其他方法可以使用以下库/执行任务: (从文件读取)导入java.io.file;符号:类文件位置:package java.io (抛出FileNotFoundException)导入java.io.Fil
问题内容: 我从没想过会发生这种情况,但是遇到了我的第一个Java错误: http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=5003595 我几乎与错误(在Linux上为NFS)中描述的情况完全相同,并且我看到File.exists()没有返回正确的值(至少不是立即返回)。 所以我的问题是,这种检查文件是否存在的方法是否可以替代?如果可能的话,我
问题内容: 在JavaScript中,不支持本机JSON的浏览器有哪些替代方案?谢谢 问题答案: 您应该使用该库。它是某些浏览器本地包含的标准的基础。 您可以在这里找到它起源的页面:https : //github.com/douglascrockford/JSON- js/blob/master/json2.js 该脚本会自动确保仅在尚不存在的情况下添加方法,因此在具有该方法的浏览器中不会存在危
问题内容: 我试图在Android中实现算法AES 128,但是它不起作用,问题是 和 是否存在替代方案? 我的方法: 我看到了其他答案,但是无法实现解决方案。 问题答案: 解 我用解决了我的问题 我将android.util.Base64用于Android 不兼容 / 替换
问题内容: PHP_excel是否有其他选择可以以自定义格式“导出到XLSX / XLS”文件? 问题答案: 我编写了一个非常简单的类,用于导出到“ Excel XML”(又名SpreadsheetML)。对于最终用户而言,它不如XSLX方便(取决于文件扩展名和Excel版本,他们可能会收到警告消息),但使用起来比XLS或XLSX容易得多。