使用流生成地图时忽略重复项

新手上路,请多包涵
Map<String, String> phoneBook = people.stream()
                                      .collect(toMap(Person::getName,
                                                     Person::getAddress));

当找到重复的元素时,我得到 java.lang.IllegalStateException: Duplicate key

是否可以在向地图添加值时忽略此类异常?

当有重复时,它应该通过忽略重复的键来继续。

原文由 Patan 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 631
2 个回答

这可以使用 --- 的 Collectors.toMap(keyMapper, valueMapper, mergeFunction) mergeFunction 参数:

 Map<String, String> phoneBook =
    people.stream()
          .collect(Collectors.toMap(
             Person::getName,
             Person::getAddress,
             (address1, address2) -> {
                 System.out.println("duplicate key found!");
                 return address1;
             }
          ));

mergeFunction 是一个对与同一键关联的两个值进行操作的函数。 adress1 对应于收集元素时遇到的第一个地址 adress2 对应于遇到的第二个地址:这个 lambda 只是告诉保留第一个地址并忽略第二个地址。

原文由 Tunaki 发布,翻译遵循 CC BY-SA 3.0 许可协议

正如 JavaDocs 中所说:

如果映射的键包含重复项(根据 Object.equals(Object) ),执行收集操作时将抛出 IllegalStateException 。如果映射的键可能有重复项,请改用 toMap(Function keyMapper, Function valueMapper, BinaryOperator mergeFunction)

所以你应该使用 toMap(Function keyMapper, Function valueMapper, BinaryOperator mergeFunction) 代替。只需提供一个 合并功能,它将确定将哪个重复项放入地图中。

例如,如果您不关心是哪一个,只需调用

Map<String, String> phoneBook = people.stream().collect(
        Collectors.toMap(Person::getName, Person::getAddress, (a1, a2) -> a1));

原文由 alaster 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题