在java8之后我们list转map再也不用循环put到map了,我们用lambda表达式,使用stream可以一行代码解决,下面我来简单介绍list转map的几种方式,和转为map后对map进行分组、求和、过滤等操作。
list<User> 转map
当我们不知道 key 是否有重复时,可以用 (k1,k2)->k1 来设置,如果有重复的key,则保留key1,舍弃key2。
Map<Integer, User> maps = list.stream().collect
(Collectors.toMap(User::getAge, a -> a, (k1, k2) -> k1));
输出结果
{18=User{name='pangHu', age=18},
20=User{name='laoBi', age=20},
15=User{name='piKaQiu', age=15}}
第三种
如果我们要求map的顺序要按照list的执行的话,我们就要转map的时候指定map的具体实现。
Map<String, User> maps3 = list.stream().collect
(Collectors.toMap(User::getName,Function.identity(),(k1, k2) -> k1,LinkedHashMap::new));
输出结果
{pangHu=User{name='pangHu', age=18},
piKaQiu=User{name='piKaQiu', age=15},
laoBi=User{name='laoBi', age=20},
wangHao=User{name='wangHao', age=20}}
分组
List里面的对象元素,以某个属性来分组,例如,以age分组,将age相同的放在一起
Map<Integer, List<User>> group = list.stream().collect
(Collectors.groupingBy(User::getAge));
输出结果
{18=[User{name='pangHu', age=18}],
20=[User{name='laoBi', age=20},
User{name='wangHao', age=20}],
15=[User{name='piKaQiu', age=15}]}
过滤
过滤 list ,从集合中过滤出来符合条件的元素
List<User> filterList = list.stream().filter
(a -> a.getName().equals("pangHu")).collect(Collectors.toList());
输出结果
[User{name='pangHu', age=18}]