Java lambda:捕获重复键映射上的异常

时间:2017-01-27 22:51:28

标签: java lambda exception-handling java-8

我有一个Person,我想将其映射到另一个lastname

现在,这可能会导致通常不相等的两个 Map<Person, Long> personToSalaray = getMappings(); // lastname to salary Map<String, Long> personToSalary.entrySet().stream() .collect(toMap( e -> e.getKey().getLastname(), e -> e.getValue())); 对象具有相等的--disable-float属性,这将导致重复键插入新映射。这没关系,只要我能抓住这个异常,并抛出我自己的异常。但不知道该怎么做。

这是代码。

--with-xlen

虽然这有效,但它可能会在重复键插入时引发异常(同一姓氏)。怎么抓住它?我无法在toMap中声明try-catch。

2 个答案:

答案 0 :(得分:3)

根据Collectors.map()的Javadocs:

  

如果映射的密钥包含重复项(根据Object.equals(Object)),则在执行收集操作时会抛出IllegalStateException。如果映射的密钥可能有重复,请改用toMap(Function, Function, BinaryOperator)

因此,解决方案不应该捕获异常,而是使用专门用于处理重复项的其他toMap重载。该方法的文档提供了一个接近您的场景的示例:

  

有多种方法可以处理映射到同一个键的多个元素之间的冲突。其他形式的toMap只使用无条件抛出的合并函数,但您可以轻松编写更灵活的合并策略。例如,如果您有一个Person流,并且您想要生成一个电话簿&#34;将名称映射到地址,但两个人可能具有相同的名称,您可以按照以下方式优雅地处理这些冲突,并将地图映射名称生成到连接的地址列表中:

Map<String, String> phoneBook
     people.stream().collect(toMap(Person::getName,
                                   Person::getAddress,
                                   (s, a) -> s + ", " + a));

答案 1 :(得分:2)

使用https://docs.oracle.com/javase/8/docs/api/java/util/stream/Collectors.html#toMap-java.util.function.Function-java.util.function.Function-java.util.function.BinaryOperator-

Map<String, Long> personToSalary.entrySet().stream()
            .collect(toMap(
                    e -> e.getKey().getLastname(),
                    e -> e.getValue(),
                    (a, b) -> a // just choose one of the duplicates, or you can put more logic to decide which one you need
));