Java Stream:List分组成Map或LinkedHashMap

在Java中,使用Stream API可以轻松地对集合进行操作,包括将List转换为Map或LinkedHashMap。本篇博客将演示如何利用Java Stream实现这两种转换,同时假设List中的元素是User对象。


1. 数据准备

java 复制代码
List<User> list = new ArrayList<>();
list.add(new User(1, "张三", "我是张三01"));
list.add(new User(2, "张三", "我是张三02"));
list.add(new User(3, "李四", "我是李四01"));
list.add(new User(4, "李四", "我是李四02"));
list.add(new User(5, "王五", "我是王五01"));
list.add(new User(6, "王五", "我是王五02"));

2. List转Map(无序-默认)

List转Map有两种Map格式,分别是 Map<String, User>和 Map<String, List>,下面我将分别展示:

2.1 List转Map<String, User>

转换成Map<String, User>我们需要使用到Collectors.toMap方法:

java 复制代码
//通过名字进行分组,如果名字重复的话只取第一个:List转Map<String, User>
Map<String, User> map01 = list.stream().collect(Collectors.toMap(User::getName, Function.identity(), (u1, u2) -> u1));
System.out.println(map01);

执行结果:

java 复制代码
{
李四=User(id=3, name=李四, note=我是李四01), 
张三=User(id=1, name=张三, note=我是张三01), 
王五=User(id=5, name=王五, note=我是王五01)
}

2.2 List转Map<String, List<User>>

转换成Map<String, List<User>>我们需要使用到Collectors.groupingBy方法:

java 复制代码
//通过名字进行分组,如果名字重复的话就分组成List:List转Map<String, List<User>>
Map<String, List<User>> map02 = list.stream().collect(Collectors.groupingBy(User::getName));
System.out.println(map02);

执行结果:

java 复制代码
{
李四=[User(id=3, name=李四, note=我是李四01), User(id=4, name=李四, note=我是李四02)], 
张三=[User(id=1, name=张三, note=我是张三01), User(id=2, name=张三, note=我是张三02)], 
王五=[User(id=5, name=王五, note=我是王五01), User(id=6, name=王五, note=我是王五02)]
}

我们可以看到:map中打印出来的执行结果并没有按照List中添加的顺序打印的

3. List转LinkedHashMap(有序)

List转LinkedHashMap也有两种Map格式,分别是 LinkedHashMap<String, User>和 LinkedHashMap<String, List>,下面我将分别展示:

3.1 List转LinkedHashMap<String, User>

转换成LinkedHashMap<String, User>我们需要使用到Collectors.toMap方法:

java 复制代码
//通过名字进行分组,如果名字重复的话只取第一个:List转LinkedHashMap<String, User>
Map<String, User> map03 = list.stream().collect(Collectors.toMap(User::getName, Function.identity(), (u1, u2) -> u1, LinkedHashMap::new));
System.out.println(map03);

执行结果:

java 复制代码
{
张三=User(id=1, name=张三, note=我是张三01), 
李四=User(id=3, name=李四, note=我是李四01), 
王五=User(id=5, name=王五, note=我是王五01)
}

3.2 List转LinkedHashMap<String, List<User>>

转换成LinkedHashMap<String, List<User>>我们需要使用到Collectors.groupingBy方法:

java 复制代码
//通过名字进行分组,如果名字重复的话就分组成List:List转LinkedHashMap<String, List<User>>
Map<String, List<User>> map04 = list.stream().collect(Collectors.groupingBy(User::getName, LinkedHashMap::new, Collectors.toList()));
System.out.println(map04);

执行结果:

java 复制代码
{
张三=[User(id=1, name=张三, note=我是张三01), User(id=2, name=张三, note=我是张三02)], 
李四=[User(id=3, name=李四, note=我是李四01), User(id=4, name=李四, note=我是李四02)], 
王五=[User(id=5, name=王五, note=我是王五01), User(id=6, name=王五, note=我是王五02)]
}

我们可以看到:map中打印出来的执行结果是按照List中添加的顺序打印的

4. 总结

在List转Map的过程中:

如果我们对Map中的顺序没要求,我们可以通过stream流将List转换为默认的HMap即可

如果我们对Map中的顺序有要求,我们可以通过stream流将List转换为LinkedHashMap才行

5. 全部代码

java 复制代码
public static void test1() {
    List<User> list = new ArrayList<>();
    list.add(new User(1, "张三", "我是张三01"));
    list.add(new User(2, "张三", "我是张三02"));
    list.add(new User(3, "李四", "我是李四01"));
    list.add(new User(4, "李四", "我是李四02"));
    list.add(new User(5, "王五", "我是王五01"));
    list.add(new User(6, "王五", "我是王五02"));
    //通过名字进行分组,如果名字重复的话只取第一个:List转Map<String, User>
    Map<String, User> map01 = list.stream().collect(Collectors.toMap(User::getName, Function.identity(), (u1, u2) -> u1));
    System.out.println(map01);
    //通过名字进行分组,如果名字重复的话就分组成List:List转Map<String, List<User>>
    Map<String, List<User>> map02 = list.stream().collect(Collectors.groupingBy(User::getName));
    System.out.println(map02);
    //通过名字进行分组,如果名字重复的话只取第一个:List转LinkedHashMap<String, User>
    Map<String, User> map03 = list.stream().collect(Collectors.toMap(User::getName, Function.identity(), (u1, u2) -> u1, LinkedHashMap::new));
    System.out.println(map03);
    //通过名字进行分组,如果名字重复的话就分组成List:List转LinkedHashMap<String, List<User>>
    Map<String, List<User>> map04 = list.stream().collect(Collectors.groupingBy(User::getName, LinkedHashMap::new, Collectors.toList()));
    System.out.println(map04);
}
java 复制代码
public class User {

    private Integer id;

    private String name;

    private String note;
}
相关推荐
Boilermaker19925 小时前
[Java 并发编程] Synchronized 锁升级
java·开发语言
Cherry的跨界思维5 小时前
28、AI测试环境搭建与全栈工具实战:从本地到云平台的完整指南
java·人工智能·vue3·ai测试·ai全栈·测试全栈·ai测试全栈
alonewolf_995 小时前
JDK17新特性全面解析:从语法革新到模块化革命
java·开发语言·jvm·jdk
一嘴一个橘子5 小时前
spring-aop 的 基础使用(啥是增强类、切点、切面)- 2
java
sheji34166 小时前
【开题答辩全过程】以 中医药文化科普系统为例,包含答辩的问题和答案
java
恋爱绝缘体16 小时前
2020重学C++重构你的C++知识体系
java·开发语言·c++·算法·junit
wszy18096 小时前
新文章标签:让用户一眼发现最新内容
java·python·harmonyos
wszy18097 小时前
顶部标题栏的设计与实现:让用户知道自己在哪
java·python·react native·harmonyos
程序员小假7 小时前
我们来说一下无锁队列 Disruptor 的原理
java·后端
资生算法程序员_畅想家_剑魔8 小时前
Kotlin常见技术分享-02-相对于Java 的核心优势-协程
java·开发语言·kotlin