Java Stream如何将List分组成Map或LinkedHashMap
作者:shyの同学
前言
在Java中,使用Stream API可以轻松地对集合进行操作,包括将List转换为Map或LinkedHashMap。本篇博客将演示如何利用Java Stream实现这两种转换,同时假设List中的元素是User对象。
1. 数据准备
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方法:
//通过名字进行分组,如果名字重复的话只取第一个:List转Map<String, User> Map<String, User> map01 = list.stream().collect(Collectors.toMap(User::getName, Function.identity(), (u1, u2) -> u1)); System.out.println(map01);
执行结果:
{
李四=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方法:
//通过名字进行分组,如果名字重复的话就分组成List:List转Map<String, List<User>> Map<String, List<User>> map02 = list.stream().collect(Collectors.groupingBy(User::getName)); System.out.println(map02);
执行结果:
{
李四=[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方法:
//通过名字进行分组,如果名字重复的话只取第一个: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);
执行结果:
{
张三=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方法:
//通过名字进行分组,如果名字重复的话就分组成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);
执行结果:
{
张三=[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. 全部代码
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); }
public class User { private Integer id; private String name; private String note; }
总结
到此这篇关于Java Stream如何将List分组成Map或LinkedHashMap的文章就介绍到这了,更多相关List分组成Map或LinkedHashMap内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!