java - 如何获取 Collectors.toMap 合并功能中的 key ?

标签 java java-8 collectors

当在 Collectors.toMap() 期间发现重复的键条目时,将调用合并函数 (o1, o2)

问题:如何获取导致重复的 key ?

String keyvalp = "test=one\ntest2=two\ntest2=three";

Pattern.compile("\n")
    .splitAsStream(keyval)
    .map(entry -> entry.split("="))
    .collect(Collectors.toMap(
        split -> split[0],
        split -> split[1],
        (o1, o2) -> {
            //TODO how to access the key that caused the duplicate? o1 and o2 are the values only
            //split[0]; //which is the key, cannot be accessed here
        },
    HashMap::new));

在合并函数中,我想根据决定是取消映射,还是继续并采用这些值。

最佳答案

您需要使用自定义收集器或使用不同的方法。

Map<String, String> map = new Hashmap<>();
Pattern.compile("\n")
    .splitAsStream(keyval)
    .map(entry -> entry.split("="))
    .forEach(arr -> map.merge(arr[0], arr[1], (o1, o2) -> /* use arr[0]));

编写自定义收集器要复杂得多。您需要一个类似的 TriConsumer(键和两个值),它不在 JDK 中,这就是为什么我很确定没有使用内置函数的原因。 ;)

关于java - 如何获取 Collectors.toMap 合并功能中的 key ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44407112/

相关文章:

java - 如何使用启用了 Websphere SSL 的 MQ 配置 JBOSS 连接?

java - 需要额外过滤时重用流 - Java

Java流。对对象流中的两个字段求和

java-8 - 在深层属性上收集 groupBy

java - 使用泛型在类上实现 equals 时避免警告

java - @Bean 初始化 - 参数注入(inject)与直接方法访问之间的区别?

java - v4 androidmanifest.xml 文件未找到

Java 8 : Convert file time (milliseconds from 1970) to RFC 1123 format

Java 流收集器在 Set::size 上出现 groovy 错误

java - 使用收集器将列表转换为对象映射 - Java