Collectors.toMap()的基本使用方法

这篇具有很好参考价值的文章主要介绍了Collectors.toMap()的基本使用方法。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

介绍:

1、Java 8 流的新类 java.util.stream.Collectors 实现了 java.util.stream.Collector 接口,同时又提供了大量的方法对流 ( stream ) 的元素执行 map and reduce 操作,或者统计操作;

2、Collectors.toMap()是Java8引入的流特性,可以把集合转换为Map集合,转换对象中的key不可重复,重复会报错;

3、如果key重复,可以使用合并函数来取其默认值,避免报错。

使用

一、key不重复场景


//基础数据
List<PersonDto> personDtos = ListUtil.toList(
                new PersonDto(1, "张三", "西安", 22),
                new PersonDto(2, "李四", "咸阳", 23),
                new PersonDto(3, "王五", "榆林", 24),
                new PersonDto(4, "赵六", "宝鸡", 25),
                new PersonDto(5, "孙七", "延安", 26)
        );

 文章来源地址https://www.toymoban.com/news/detail-686070.html


//1.List转Map,id作为key,name作为value
Map<Integer, String> collect = personDtos
                .stream()
                .collect(Collectors.toMap(PersonDto::getId, PersonDto::getName));
System.out.println("collect = " + collect);

结果:	
collect = {1=张三, 2=李四, 3=王五, 4=赵六, 5=孙七}

 


//2. List转Map,id作为key,元素对象作为value
Map<Integer, PersonDto> collect1 = personDtos
                .stream()
                .collect(Collectors.toMap(PersonDto::getId, o -> o));
System.out.println("collect1 = " + collect1);

结果:
collect1 = {1=PersonDto{id=1, name='张三', address='西安', age=22}
          , 2=PersonDto{id=2, name='李四', address='咸阳', age=23}
          , 3=PersonDto{id=3, name='王五', address='榆林', age=24}
          , 4=PersonDto{id=4, name='赵六', address='宝鸡', age=25}
          , 5=PersonDto{id=5, name='孙七', address='延安', age=26}}

二、key重复场景


//基础数据
List<PersonDto> personDtos = ListUtil.toList(
        new PersonDto(1, "张三", "西安", 22),
        new PersonDto(2, "李四1", "咸阳", 23),
        new PersonDto(2, "李四2", "咸阳", 23),
        new PersonDto(3, "王五1", "榆林", 24),
        new PersonDto(3, "王五2", "榆林", 24),
        new PersonDto(4, "赵六1", "宝鸡", 25),
        new PersonDto(4, "赵六2", "宝鸡", 25),
        new PersonDto(5, "孙七", "延安", 26)
);

 


//List转Map,id作为key,name作为value,如果Id重复取第一个name
        Map<Integer, String> collect = personDtos
                .stream()
                .collect(Collectors.toMap(new Function<PersonDto, Integer>() {
                    @Override
                    public Integer apply(PersonDto personDto) {
                        return personDto.getId();
                    }
                }, new Function<PersonDto, String>() {
                    @Override
                    public String apply(PersonDto personDto) {
                        return personDto.getName();
                    }
                }, new BinaryOperator<String>() {
                    @Override
                    public String apply(String s, String s2) {
                        return s;
                    }
                }));
System.out.println("collect = " + collect);
结果:
collect = {1=张三, 2=李四1, 3=王五1, 4=赵六1, 5=孙七}


//List转Map,id作为key,name作为value,如果Id重复取第一个name
Map<Integer, String> collect = personDtos
      .stream()
      .collect(Collectors.toMap(PersonDto::getId, PersonDto::getName, (value1, value2) -> value1));
System.out.println("collect = " + collect);

结果:
collect = {1=张三, 2=李四1, 3=王五1, 4=赵六1, 5=孙七}

 


//List转Map,id作为key,元素对象作为value,如果Id重复取第一个元素
Map<Integer, PersonDto> collect1 = personDtos
      .stream()
      .collect(Collectors.toMap(PersonDto::getId, o -> o, (value1, value2) -> value1));
System.out.println("collect1 = " + collect1);

结果:
collect1 = {1=PersonDto{id=1, name='张三', address='西安', age=22}
          , 2=PersonDto{id=2, name='李四1', address='咸阳', age=23}
          , 3=PersonDto{id=3, name='王五1', address='榆林', age=24}
          , 4=PersonDto{id=4, name='赵六1', address='宝鸡', age=25}
          , 5=PersonDto{id=5, name='孙七', address='延安', age=26}}

 

三、Collectors.toMap()NullPointerException异常处理


public static void main(String[] args) {
   List<PersonDto> personDtos = ListUtil.toList(
        new PersonDto(1, null, "西安", 22),
        new PersonDto(2, "李四", "咸阳", 23),
        new PersonDto(3, "王五", "榆林", 24),
        new PersonDto(4, "赵六", "宝鸡", 25),
        new PersonDto(5, "孙七", "延安", 26)
   );

Map<Integer, String> collect = personDtos
      .stream()
      .collect(Collectors.toMap(PersonDto::getId, s -> s.getName() ));
System.out.println("collect = " + collect);

Exception in thread "main" java.lang.NullPointerException
    at java.util.HashMap.merge(HashMap.java:1225)
    at java.util.stream.Collectors.lambda$toMap$58(Collectors.java:1320)
    at java.util.stream.ReduceOps$3ReducingSink.accept(ReduceOps.java:169)
    at java.util.ArrayList$ArrayListSpliterator.forEachRemaining(ArrayList.java:1382)
    at java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:481)
    at java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:471)
    at java.util.stream.ReduceOps$ReduceOp.evaluateSequential(ReduceOps.java:708)
    at java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)
    at java.util.stream.ReferencePipeline.collect(ReferencePipeline.java:499)
    at com.cic.dimp.authority.model.SysUserEntity.main(SysUserEntity.java:252)

解决方法


//1设置时增加判断如果是null,则设置默认值

   Map<Integer, String> collect = personDtos
         .stream()
         .collect(Collectors.toMap(PersonDto::getId, s -> s.getName() == null ? "default" : s.getName()));
   System.out.println("collect = " + collect);

//2使用Optional<T>对值进行包装

   Map<Integer, String> collect1 = personDtos
         .stream()
         .collect(Collectors.toMap(PersonDto::getId,s -> Optional.ofNullable(s.getName()).orElse("default")));
   System.out.println("collect1 = " + collect1);

//3 使用collect(Supplier<R> supplier, BiConsumer<R, ? super T> accumulator, BiConsumer<R, R> combiner) 来构建,可允许null值的出现

   HashMap<Integer, String> collect2 = personDtos
         .stream()
         .collect(HashMap::new, (n, v) -> n.put(v.getId(), v.getName()), HashMap::putAll);
   System.out.println("collect2 = " + collect2);
}

结果:
collect = {1=default, 2=李四, 3=王五, 4=赵六, 5=孙七}
collect1 = {1=default, 2=李四, 3=王五, 4=赵六, 5=孙七}
collect2 = {1=null, 2=李四, 3=王五, 4=赵六, 5=孙七}

结论


.collect(Collectors.toMap(PersonDto::getId, o -> o, (value1, value2) -> value1));

第一个参数PersonDto::getId 表示选择PersonDto的getId作为map的key值;

第二个参数o -> o表示选择将原来的对象作为map的value值;

第三个参数(value1, value2) -> value1中,如果value1与value2的key值相同,选择value1作为那个key所对应的value值。

 

 

到了这里,关于Collectors.toMap()的基本使用方法的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 详细解决java中的Collectors.toMap引起的java.lang.IllegalStateException: Duplicate key xxx 的错误

    今天,测试在禅道上给我指出一个正式环境 bug ,如下图所示: 即 java.lang.IllegalStateException: Duplicate key 2 。 根据 java.lang.IllegalStateException: Duplicate key 2 可知,这是 java 抛出的存在 2个重复键 的错误。 如果想要弄清楚错误原因,通过如下几个步骤分析: 首先,看到这个错误信息

    2024年01月19日
    浏览(60)
  • 使用Java8 Stream流中的Collectors.collectingAndThen()方法去重

    Collectors.collectingAndThen() 根据对象属性进行去重操作 Collectors.collectingAndThen()方法属于java8 Stream流中的 java.util.stream.Collectors ,此类实现了 java.util.stream.Collector 接口,还提供了大量的方法对Stream流中的元素进行 map 和 reduce 操作 在获取任务的时候,会出现id重复的状况,利用 Co

    2024年02月09日
    浏览(63)
  • Java stream流toMap使用过程中空指针问题

    Java8中stream操作list时常见的一个错误: 排查原因: 定位到代码中发现从数据查询是存在数据的 排查stream前对象为null的情况,那问题只能出现在toMap这里了 我们需要知道toMap是怎么帮我们封装数据的,先搞明白toMap的原理,点击源码可以看到他并不是通过map中的put方法封装数

    2024年02月05日
    浏览(38)
  • Collectors.partitioningBy使用将List分解成两个集合

    结果:

    2024年02月13日
    浏览(51)
  • java 8 stream toMap key的重复问题

    工作中遇到需要将某个List里面的实体类的两个属性对应起来,比如根据姓名找到年龄,就是将List里面的entity属性解析之后放到Map里。 实体类: 逻辑: 单纯常规写法肯定没什么问题,就是后面的key会被覆盖,但是stream流不行,会报错。 Collectors.toMap这个方法其实是有三个参数

    2024年01月22日
    浏览(39)
  • Collectors.groupingBy()进行分组时,分组值存在null值会报NPE(空指针)错误,使用时要注意

    1、使用Collectors.groupingBy()进行分组时,分组值存在null值。 解决办法:分组值为null时,默认值为空字符。

    2024年02月14日
    浏览(66)
  • Java流式操作——Collectors工具类

    Java中的Collectors工具类是用于收集流中的元素并生成结果的工具类。它提供了一系列静态方法,可以用于对流进行归约、分组、分区、转换等操作。 ● maxBy:获取流中最大元素;minBy:获取流中最小元素 ● joining:合并,将流中的元素,以字符串的形式拼接起来 ● summingInt:把流

    2024年02月02日
    浏览(50)
  • Java8 Collectors类详解(一)

      Collectors 类是用于对流进行收集和汇总的工具类。它提供了许多方法来对流进行分组、统计、转换、分区、连接、归约等操作,使得处理集合类数据变得更加方便。         在使用 Collectors 类时,我们可以通过调用其中的方法来实现对流的不同处理方式。例如,将流中

    2024年02月07日
    浏览(53)
  • java8新特性之toMap的用法——全网独一无二的通俗易懂的讲解

    对于java8的新特性toMap方法,相信有很多人都在工作中用过,接下来就通俗易懂的讲解一下toMap吧 先来看看官网对于toMap方法的解释 toMap有个三个重载的方法,每一个重载方法的详解分别如下 (1)方法1:两个参数 public static T, K, U Collector T, ?, MapK,U toMap(Function? super T, ? extends

    2024年02月08日
    浏览(61)
  • Stream toList不能滥用以及与collect(Collectors.toList())的区别

    Stream toList() 返回的是只读List原则上不可修改, collect(Collectors.toList()) 默认返回的是ArrayList,可以增删改查 在公司看到开发环境突然发现了 UnsupportedOperationException 报错,想到了不是自己throw的应该就是操作collection不当。 发现的确是同事使用了类似 stringList.stream().filter(number -

    2024年01月22日
    浏览(36)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包