JAVA8 List转换Map 之 Collectors.toMap()
前言
工作时会经常使用List对象集合转换Map集合、以及各种集合的转换、查询、筛选,从而方便后续操作。
一、利用stream().forEach()遍历集合
List<String> list = new ArrayList<String>();
list.add("djk");
list.add("djk1");
list.add("djk12");
list.add("djk123");
//利用stream().forEach()遍历集合
list.stream().forEach(item->{System.out.print(item+" ");});
二、利用stream().map()对List进行大写处理,并给另外一个List赋值,并对其遍历
List<String> list = new ArrayList<String>();
list.add("list1");
list.add("list2");
list.add("list3");
list.add("list4");
List<String> list4 = new ArrayList<String>(); //同理 toLowerCase
list4 = list.stream().map(item -> item.toUpperCase()).collect(Collectors.toList());
list4.stream().forEach(item -> {
System.out.println(item);
});
三、利用stream().filter()对List进行过滤处理,并给另一个list赋值,并对其遍历
List<String> list = new ArrayList<String>();
list.add("list1");
list.add("list2");
list.add("list3");
list.add("list4");
List<String> list3 = new ArrayList<String>();
list3 = list.stream().filter(item -> !item.equals("list3")).collect(Collectors.toList());
list3.stream().forEach(item -> {
System.out.println(item);
});
四、求某一个数列的最大值、最小值、和、平均值、数列元素数
List<Integer> list = new ArrayList<Integer>();
list.add(1);
list.add(2);
list.add(3);
list.add(4);
IntSummaryStatistics stat = list.stream().mapToInt((item) -> item).summaryStatistics();
System.out.println("最大:" + stat.getMax());
System.out.println("最小:" + stat.getMin());
System.out.println("总和:" + stat.getSum());
System.out.println("计数:" + stat.getCount());
System.out.println("平均:" + stat.getAverage());
1)没有引入 Collectors.toMap()之前,对象集合转换代码非常臃肿,例:
1、首先我们有一个用户类 User
2、我们来初始化一个List数组:这样查询会让代码非常的臃肿
既然我们以 key 的方式去查找, List 集合转成 Map集合,存于Map中。这样操作起来就会显得更加的巧便
但是仍然会有些繁琐,上面代码我们将list通过遍历,将它转化为了一个map
3、在JAVA8中,我们可以利用 Java 8 stream 特性对集合进行操作,当我们引入Collectors.toMap()之后,代码将会大大简化
4、再了解下常用的 List 转 Map 的常见方式和一些注意事项:
4.1 List 转 Map,值为对象:
Map<String, User> map = users.stream().collect(Collectors.toMap(User::getUsername, u -> u));
4.2 List 转 Map,值为属性:
Map<String, Integer> map = users.stream().collect(Collectors.toMap(User::getUsername, User::getDeptType));
4.3 List 转 Map,值为属性,并且加工数据
Map<String, Integer> map = users.stream().collect(Collectors.toMap(u -> "List集合" + u.getUsername(), User::getDeptType))
4.4 注意 Map中的key是不能重复的,那么如果list集合被转换为map集合时,有多个key怎么办,下面我们把deptType 中key改为相同的运行一下会出现异常
那么如何避免这种key重复呢,可以使用Java 8 stream 新特性,stream API 中添加Lamda表达式
(u1,u2) -> u1, 意思就是:map的key出现重复的时候,我们取第一个key和value作为基准,忽略相同的情况。
那接下来 覆盖原则 也基本是一样的 将(u1,u2) -> u2,已后面的key和value作为基准,自动覆盖之前值
当然也有小可爱会问,我俩全都要可以不可以,太可以了。可以根据值类型来连接。
Map<Integer, String> map = users.stream().collect(Collectors.toMap(User::getDeptType, User::getUsername, (u1, u2) -> u1 + "," + u2));
4.5 该说不说数据中经常会出现null的情况,那么遇到这种value为null的情况,怎么去避免呢
我们还是在此基础上做一些处理:避免为null的问题