Java Stream流 List< T >转换Map方法汇总合集(大概是最全吧)

这篇具有很好参考价值的文章主要介绍了Java Stream流 List< T >转换Map方法汇总合集(大概是最全吧)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Java Stream流 List< T >转换Map方法汇总合集(大概是最全吧)

本文主要介绍 Java 中利用 Stream 流将 List< T > 类型数据转换成 Map 类型的几种方法整合汇总,其中包含了toMap()、groupingBy()、partitioningBy()等方法的使用,建议收藏方便查阅,如果有帮助到您,不要吝啬点赞、收藏!

tips:本文没有推荐使用三方类库提供的 List 转 Map 工具类方法,因为在博主公司引入三方依赖需要在评审时说出引用原因,哈哈哈(太麻烦),当然有很多好用三方工具类可以直接完成 List 转 Map 的操作,如有需要,后续博主会单独写一篇三方类库的 List 转 Map 工具类方法博文提供给大家。

💗💗💗您的点赞、收藏、评论是博主输出优质文章的的动力!!!💗💗💗

以下示例会覆盖工作中绝大部分的使用场景,如有没有覆盖到的场景,后续会基于本文持续更新!!所以大家一定要收藏!点赞!欢迎在评论区与博主沟通交流!!👇🏻 👇🏻 👇🏻

List< String > -> Map< String,List< String>>

示例一

通过Stream流完成转换:

 	@Test
    public void testList1() {
        List<String> list = Arrays.asList("s1:01", "s2:02", "s3:03", "s4:04");
        Pattern DELIMITER = Pattern.compile(":");
        Map<String, List<String>> map = list.stream().map(DELIMITER::split)
                .collect(Collectors.groupingBy(a -> a[0],
                        Collectors.mapping(a -> a[1], Collectors.toList())));
        System.out.println(JSONObject.toJSONString(map));
    }

运行结果:
stream流转换为map,Java,java,list,map,stream,lambda

示例二

通过forEach循环转换:

    @Test
    public void testList1() {
        List<String> list = Arrays.asList("s1:01", "s2:02", "s3:03", "s4:04");
        Map<String, Set<String>> map = new HashMap<>();
        list.forEach(location -> {
            String[] strArr = location.split(":");
            map.compute(strArr[0], (country, codes) -> {
                codes = codes == null ? new HashSet<>() : codes;
                codes.add(strArr[1]);
                return codes;
            });
        });
        System.out.println(JSONObject.toJSONString(map));
    }

运行结果:

stream流转换为map,Java,java,list,map,stream,lambda

List< T > -> Map< T, T >

List< Integer> -> Map< Integer,Integer>

代码示例(本示例是存在重复key,并且会以首个出现的 key 去覆盖后面出现的冲突 key):

 	@Test
    public void testList2() {
        List<Integer> list = Lists.newArrayList(1, 2, 3, 4, 4, 5, 6, 7, 8);
        Map<Integer, Integer> collect = list.stream().collect(Collectors.toMap(k -> k, v -> v, (k1, k2) -> k1));
        System.out.println("collect:" + collect);
    }

toMap()无重复key

示例一

List泛型为 Student 对象,示例需要将name属性作为 key,age 属性作为value;

    @Test
    public void testList2() {
        List<Student> list = Lists.newArrayList(
                new Student("小张", 17, DateUtil.parse("2006-10-03 15:18:56"), 11),
                new Student("小李", 15, DateUtil.parse("2008-03-19 02:18:56"), 5),
                new Student("小王", 16, DateUtil.parse("2007-02-21 22:18:56"), 29));
        Map<String, Integer> collect = list.stream().collect(Collectors.toMap(Student::getName, Student::getAge));
        System.out.println(JSONObject.toJSONString(collect));
    }
示例二

List泛型为 Student 对象,示例需要将name属性作为 key, Student 对象作为value;

@Test
    public void testList2() {
        List<Student> list = Lists.newArrayList(
                new Student("小张", 17, DateUtil.parse("2006-10-03 15:18:56"), 11),
                new Student("小李", 15, DateUtil.parse("2008-03-19 02:18:56"), 5),
                new Student("小王", 16, DateUtil.parse("2007-02-21 22:18:56"), 29));
        Map<String, Student> collect = list.stream().collect(Collectors.toMap(Student::getName, student -> student));
        System.out.println(JSONObject.toJSONString(collect));
    }

运行结果:

stream流转换为map,Java,java,list,map,stream,lambda

toMap()有重复key

当存在重复 key 时,编译器会报错:java.lang.IllegalStateException: Duplicate key xxxx;
stream流转换为map,Java,java,list,map,stream,lambda

出现这种情况就需要在 toMap() 方法中指定 key 来避免冲突;

示例一

解决办法:使用第一个key 覆盖第二个key;

    @Test
    public void testList2() {
        List<Student> list = Lists.newArrayList(
                new Student("小张", 17, DateUtil.parse("2006-10-03 15:18:56"), 11),
                new Student("小李", 15, DateUtil.parse("2008-03-19 02:18:56"), 5),
                new Student("小李", 15, DateUtil.parse("2008-03-19 02:18:56"), 2),
                new Student("小王", 16, DateUtil.parse("2007-02-21 22:18:56"), 29));
        Map<String, Student> collect = list.stream().collect(Collectors.toMap(Student::getName, student -> student, (key1, key2) -> key1));
        System.out.println(JSONObject.toJSONString(collect));
    }

运行结果(保留了 “num”:11 的对象):

stream流转换为map,Java,java,list,map,stream,lambda

示例二

解决办法:使用第二个key 覆盖第一个key;

	@Test
    public void testList2() {
        List<Student> list = Lists.newArrayList(
                new Student("小张", 17, DateUtil.parse("2006-10-03 15:18:56"), 11),
                new Student("小李", 15, DateUtil.parse("2008-03-19 02:18:56"), 5),
                new Student("小李", 15, DateUtil.parse("2008-03-19 02:18:56"), 2),
                new Student("小王", 16, DateUtil.parse("2007-02-21 22:18:56"), 29));
        Map<String, Student> collect = list.stream().collect(Collectors.toMap(Student::getName, student -> student, (key1, key2) -> key2));
        System.out.println(JSONObject.toJSONString(collect));
    }

运行结果(保留了 “num”:2 的对象):

stream流转换为map,Java,java,list,map,stream,lambda

toMap()空指针异常

当 value 为空时,使用 toMap() 方法进行转换,编译器会抛出 java.lang.NullPointerException;

	@Test
    public void testList2() {
        List<Student> list = Lists.newArrayList(
                new Student("小张", 17, DateUtil.parse("2006-10-03 15:18:56"), 11),
                new Student("小李", 15, DateUtil.parse("2008-03-19 02:18:56"), 5),
                new Student("小王", 16, DateUtil.parse("2007-02-21 22:18:56"), 29),
                new Student("小田", null, DateUtil.parse("2007-02-21 22:18:56"), null));
        Map<String, Integer> collect = list.stream().collect(Collectors.toMap(Student::getName, Student::getAge));
        System.out.println(JSONObject.toJSONString(collect));
    }

运行结果:

stream流转换为map,Java,java,list,map,stream,lambda

解决办法一

转换时增加判断,如果是null,则设置默认值;

	@Test
    public void testList2() {
        List<Student> list = Lists.newArrayList(
                new Student("小张", 17, DateUtil.parse("2006-10-03 15:18:56"), 11),
                new Student("小李", 15, DateUtil.parse("2008-03-19 02:18:56"), 5),
                new Student("小王", 16, DateUtil.parse("2007-02-21 22:18:56"), 29),
                new Student("小田", null, DateUtil.parse("2007-02-21 22:18:56"), null));
        Map<String, Integer> collect = list.stream().collect(Collectors.toMap(Student::getName, s -> s.getAge() == null ? -1 : s.getAge()));
        System.out.println(JSONObject.toJSONString(collect));
    }

运行结果:

stream流转换为map,Java,java,list,map,stream,lambda

解决办法二

使用 Optional< T > 对值进行包装(和方式一大同小异,就是换了个写法):

	@Test
    public void testList2() {
        List<Student> list = Lists.newArrayList(
                new Student("小张", 17, DateUtil.parse("2006-10-03 15:18:56"), 11),
                new Student("小李", 15, DateUtil.parse("2008-03-19 02:18:56"), 5),
                new Student("小王", 16, DateUtil.parse("2007-02-21 22:18:56"), 29),
                new Student("小田", null, DateUtil.parse("2007-02-21 22:18:56"), null));
        Map<String, Integer> collect = list.stream().collect(Collectors.toMap(Student::getName,  s -> Optional.ofNullable(s.getAge()).orElse(-1)));
        System.out.println("Optional:"+JSONObject.toJSONString(collect));
    }

运行结果:

stream流转换为map,Java,java,list,map,stream,lambda

解决办法三

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

	@Test
    public void testList2() {
        List<Student> list = Lists.newArrayList(
                new Student("小张", 17, DateUtil.parse("2006-10-03 15:18:56"), 11),
                new Student("小李", 15, DateUtil.parse("2008-03-19 02:18:56"), 5),
                new Student("小王", 16, DateUtil.parse("2007-02-21 22:18:56"), 29),
                new Student(null, 12, DateUtil.parse("2007-02-21 22:18:56"), null));
        HashMap<Integer, String> collect = list.stream().collect(HashMap::new, (obj, v) -> obj.put(v.getAge(), v.getName()), HashMap::putAll);
        System.out.println("collect:" + collect);
    }

运行结果:

stream流转换为map,Java,java,list,map,stream,lambda

List< T > -> Map< T, List< T > >

groupingBy()

直接根据一个字段或者属性分组也可以直接用 groupingBy() 方法:

	@Test
    public void testList2() {
        List<Student> list = Lists.newArrayList(
                new Student("小张", 17, DateUtil.parse("2006-10-03 15:18:56"), 11),
                new Student("小李", 15, DateUtil.parse("2008-03-19 02:18:56"), 5),
                new Student("小李", 15, DateUtil.parse("2008-03-19 02:18:56"), 2),
                new Student("小王", 16, DateUtil.parse("2007-02-21 22:18:56"), 29));
        Map<String, List<Student>> collect = list.stream().collect(Collectors.groupingBy(Student::getName));
        System.out.println(JSONObject.toJSONString(collect));
    }

运行结果:

stream流转换为map,Java,java,list,map,stream,lambda

partitioningBy()

partitioningBy() 可以理解为特殊的 groupingBy() ,key 值为 Boolean类型:

	@Test
    public void testList2() {
        List<Student> list = Lists.newArrayList(
                new Student("小张", 17, DateUtil.parse("2006-10-03 15:18:56"), 11),
                new Student("小李", 15, DateUtil.parse("2008-03-19 02:18:56"), 5),
                new Student("小李", 15, DateUtil.parse("2008-03-19 02:18:56"), 2),
                new Student("小王", 16, DateUtil.parse("2007-02-21 22:18:56"), 29));
        Map<Boolean, List<Student>> collect = list.stream().collect(Collectors.partitioningBy(s -> s.getNum() >= 5));
        System.out.println(JSONObject.toJSONString(collect));
    }

运行结果:

stream流转换为map,Java,java,list,map,stream,lambda文章来源地址https://www.toymoban.com/news/detail-756244.html


stream流转换为map,Java,java,list,map,stream,lambda感 谢 各 位 大 佬 的 阅 读,随 手 点 赞,日 薪 过 万~! !!

到了这里,关于Java Stream流 List< T >转换Map方法汇总合集(大概是最全吧)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • Java Stream:List分组成Map或LinkedHashMap

    在Java中,使用Stream API可以轻松地对集合进行操作,包括将List转换为Map或LinkedHashMap。本篇博客将演示如何利用Java Stream实现这两种转换,同时假设List中的元素是User对象。 List转Map有两种Map格式,分别是 MapString, User 和 MapString, List ,下面我将分别展示: 转换成MapString, User我们

    2024年02月03日
    浏览(52)
  • Java中用Stream流对List对象集合转Map时key值重复的操作

    看完你还不懂,你直接喷·· 定义: 1.List是一个装Dto对象的集合 2.Dto里面有ID属性,name属性等等 3.Dto里面的ID会重复  现在要把List转成以ID为key值的map,明显key不能重复啊,所以应该怎么操作呢? (需要你有java8Stream流的基本概念,map的基本概念)   操作1:重复key,选择保留

    2024年01月18日
    浏览(59)
  • Java Stream 处理分组后取每组最大&Stream流之list转map、分组取每组第一条&Java 8 Collectors:reducing 示例(List分组取最值)

    有一个需求功能:先按照某一字段分组,再按照另外字段获取最大的那个 先根据appId分组,然后根据versionSort取最大. JDK1.8推出的stream流能极大的简化对集合的操作,让代码更美观,老规矩,直接上代码。 取list中对象的某个属性作为唯一key,对象作为value形成一个map集合,能

    2024年02月16日
    浏览(60)
  • Java8使用stream流给List<Map<String,Object>>分组(多字段key)

    Java8使用 stream流 给ListMapString,Object根据字段key 分组 一、项目场景: 从已得到的List集合中,根据某一元素(这里指map的key)进行分组,筛选出需要的数据。 如果是SQL的话则使用 group by 直接实现,代码的方式则如下: 使用到stream流的 Collectors.groupingBy() 方法。 二、代码实现 1、首

    2024年02月02日
    浏览(65)
  • 【Java】集合List转换为数组【toArray() /stream()流】实现

    在Java中,集合(List 接口的实现类)提供了一个名为 toArray 的方法,用于将集合中的元素转换成数组。该方法有两个主要的重载形式,分别用于不同的情况。 这个方法将集合中的元素复制到一个指定类型的数组中,并返回该数组。 如果指定的数组大小足够容纳集合中的所有

    2024年02月03日
    浏览(45)
  • Java将一个list<T>指定key转换成Map<list>

    经常有这种,一个数据库里有多个字段,但是数据库只能返回一个list,你group分组了也没用。 然后你得到的是一个list,你想根据type分组,大概是这样 [ {\\\"name\\\":\\\"牛奶\\\",\\\"desc\\\":\\\"吃了有力气\\\",\\\"type\\\":\\\"食物\\\"}, {\\\"name\\\":\\\"猫耳朵\\\",\\\"desc\\\":\\\"富含丰富油脂\\\",\\\"type\\\":\\\"食物\\\"}, {\\\"name\\\":\\\"电脑\\\",\\\"desc\\\":\\\"可以提升

    2024年01月24日
    浏览(53)
  • 使用java8 新特性stream流对List<Map<String, Object>>集合进行遍历、过滤、查询、去重、排序、分组

    对于一个ListMapString, Object类型的数据,可以使用Java 8的新特性stream流来进行遍历、过滤、查询、去重、排序、分组等操作。 遍历: 过滤: 查询: 去重: 排序: 分组:

    2024年02月10日
    浏览(69)
  • JAVA对象、List、Map和JSON之间的相互转换

    参考文章: Java-json相关转换,JSONObject与实体类/map互转、List/List<map>和JSONArray互转、获取JSONObject中的key value、字符串String转换等 【JSON转换】String与JSONObject、JSONArray、JAVA对象和List 的相互转换

    2024年02月03日
    浏览(64)
  • Java 把 Map 的值(Value)转换为 Array, List 或 Set

    在这篇短文中,我们将会展示如何把 Map 中的值取出来,转换为一个 Array, 、 List 或者一个 Set 。 当然,你可以使用 Java JDK 来进行转换,你也可以使用 Guava 来进行转换。 首先,让我们来看看,如何使用原生的 Java JDK把一个 Map 的值换行为 Array。 在上面的代码中,我们使用了

    2023年04月23日
    浏览(50)
  • <Java工具类>json字符串、List Map,List 对象转换为相应的JavaBean对象

    依赖: 工具类(直接上代码): 使用场景: (1).使用泛型方法:把json字符串转换为相应的JavaBean对象 ; 一般用于:Controller层: 例如: (2).List Map转换List 对象:如List,将第二个参数传递为Student对象; (3).List 对象转换List Map:

    2024年02月12日
    浏览(65)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包