我有一个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。
答案 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)
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
));