当前位置: 首页 > 知识库问答 >
问题:

如何用Lamda[DUPLICAT]处理地图中重复时的异常

庞瀚
2023-03-14

如何用LAMDA处理地图中的重复异常。

List<Person> person = Arrays.asList(
                new Person("Charles","Dickens",60),
                new Person("Dickens","Charles",60),
                new Person("Lewis","Charles",60),
                new Person("Charles","Dickens",60),
                new Person("abc","abc",20));;

            //applying toMap to collect 
        Map<Object, Object> peronMap = person.stream().limit(5)
                        .collect(Collectors.toMap(Person::getName,Person::getAge));

        System.out.println(peronMap);

这是我的单子

但我有个错误

Exception in thread "main" java.lang.IllegalStateException: Duplicate key 60
    at java.util.stream.Collectors.lambda$throwingMerger$0(Unknown Source)
    at java.util.HashMap.merge(Unknown Source)
    at java.util.stream.Collectors.lambda$toMap$58(Unknown Source)
    at java.util.stream.ReduceOps$3ReducingSink.accept(Unknown Source)
    at java.util.stream.SliceOps$1$1.accept(Unknown Source)
    at java.util.Spliterators$ArraySpliterator.tryAdvance(Unknown Source)
    at java.util.stream.ReferencePipeline.forEachWithCancel(Unknown Source)
    at java.util.stream.AbstractPipeline.copyIntoWithCancel(Unknown Source)

共有1个答案

赵渊
2023-03-14

您可以使用collectors.tomap的重载版本,它从Java文档中获取第三个参数mergefunction:

如果映射的键包含重复项(根据Object.equals(对象)),则将值映射函数应用于每个equal元素,并使用提供的合并函数合并结果。

Collector<T, ?, Map<K,U>> toMap(Function<? super T, ? extends K> keyMapper,
                                Function<? super T, ? extends U> valueMapper,
                                BinaryOperator<U> mergeFunction)

如果存在重复键,BinaryOperator的第三个参数解析合并错误:

Map<Object, Object> peronMap = person.stream().limit(5)
                    .collect(Collectors.toMap(Person::getName,
                                              Person::getAge, 
                                              (age1, age2) -> age2));

在我的示例代码中,如果有两个具有相同名称的键,它将取第二个值。

如果数据是:新人(“Charles”,“Dickens”,60)新人(“Charles”,“Dickens”,61),密钥是相同的Charles但是如果您使用我的代码,61的第二个值将被考虑,而60的第一个值将在最终的映射中被丢弃。

 类似资料:
  • 我正试图找出处理异常的最具Python风格的方法。假设我们有一个长方法,它可以完成多个注册汽车的任务 例如 检索汽车详细信息 计算税款 发送确认电子邮件 调用方法是否应该处理异常: 或者单个方法本身是否应该处理异常。如果在这个方法中有任何异常,我们只想记录下来(或者在这个例子中打印出来)并继续。 是一种方法比另一种方法更pythonic,还是归结为更具可读性?我更喜欢第二种方式,但我们似乎更频繁地

  • 我有metohod myservice#create,它抛出CustomException。我在可选#map中调用此方法,如下所示: 当我用引起异常的参数调用这个方法时,就会捕获CustomException,但结果是操作成功,状态为200。如何在lambda中处理此异常并返回异常消息?

  • 这是链接中问题的继续:我正在学习java中的异常处理(基本上是在继承中),子类方法必须抛出异常,该异常是父类方法的子类。 “当子类重写超类中的方法时,子类方法定义只能在父类方法(或重写方法)的throws子句中指定异常类的所有或子集” 这是一条规则。但我不知道制定这条规则的原因是什么,为什么不允许反之亦然。为什么要创建此规则

  • 我有一个抛出检查异常的方法: 我正在尝试创建一个通用包装器,它将优雅地处理异常。 现在我正在使用,它给我编译时错误。我可能错过了什么?

  • 我最近在我的Spring4/Hibernate Web应用程序中实现了Spring Security来处理登录/退出和不同的用户角色。 经过大量阅读,它现在似乎工作得很好,但我注意到,由于错误的Spring Security配置而引发的异常没有使用我的自定义处理程序进行优雅的处理,而是显示为一个丑陋的Tomcat错误页面(显示HTTP状态500-UserDetailsService是必需的,后跟一

  • 假设您有一个第三方库,它公开了下一个接口。 代码无法编译,因为Function不知道如何处理由domap声明的CheckedException。我想出了两个可能的解决方案。 解决方案#1-包装调用 解决方案#2-编写实用程序方法