Java8-对List转换Map、分组、求和、过滤 迈不过友情╰ 2022-03-07 06:52 935阅读 0赞 ## 前言 ## 在java8之后我们list转map再也不用循环put到map了,我们用lambda表达式,使用stream可以一行代码解决,下面我来简单介绍list转map的几种方式,和转为map后对map进行分组、求和、过滤等操作。 ## 正文 ## ### 数据准备 ### 我们准备一个ArrayList,故意让age有一对重复值 List<User> list = new ArrayList<User>(); User u1 = new User("pangHu", 18); User u2 = new User("piKaQiu", 15); User u3 = new User("laoBi", 20); User u4 = new User("wangHao", 20); list.add(u1); list.add(u2); list.add(u3); list.add(u4); static class User { private String name; private int age; public User(String name, int age) { this.name = name; this.age = age; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } @Override public String toString() { return "User{" + "name='" + name + '\'' + ", age=" + age + '}'; } } ### List转Map ### 我们在List转Map有三种情况,首先说第一种,最简单、简介的一种 **第一种** Map<String, User> maps2 = list.stream().collect(Collectors.toMap(User::getName, Function.identity())); 输出结果 {wangHao=User{name='wangHao', age=20}, piKaQiu=User{name='piKaQiu', age=15}, laoBi=User{name='laoBi', age=20}, pangHu=User{name='pangHu', age=18}} 如果我按照一个重复的元素转成map的话就会报错 Map<Integer, User> maps5 = list.stream().collect(Collectors.toMap(User::getAge, Function.identity())); 报错结果 ![watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl8zODAwMzM4OQ_size_16_color_FFFFFF_t_70][] 解决办法就是第二种写法 **第二种** ** **当我们不知道 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}] ## ## ### 求和 ### 将集合中的数据按照某个属性求和,求和分两种,一种对int 类型求和,一种是浮点类型 **第一种** int sum = list.stream().mapToInt(User::getAge).sum(); 输出结果 73 **第二种** 需要把Demo改成 private BigDecimal age; List<User> list = new ArrayList<User>(); User u1 = new User("pangHu", new BigDecimal("18")); User u2 = new User("piKaQiu", new BigDecimal("15")); User u3 = new User("laoBi", new BigDecimal("20")); User u4 = new User("wangHao", new BigDecimal("20")); list.add(u1); list.add(u2); list.add(u3); list.add(u4); BigDecimal totalMoney = list.stream().map(User::getAge).reduce(BigDecimal.ZERO, BigDecimal::add); 输出结果 73 stream还有很多方法比如最大值、最小值、平均值等,想拓展学习可自行查阅资料。 感兴趣的小伙伴可以加微信,带你进大佬云集的群 ![watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl8zODAwMzM4OQ_size_16_color_FFFFFF_t_70 1][] [watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl8zODAwMzM4OQ_size_16_color_FFFFFF_t_70]: /images/20220307/4cddaa519ba642ae9a33aa79da6be551.png [watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl8zODAwMzM4OQ_size_16_color_FFFFFF_t_70 1]: /images/20220307/996f2b83063e4bdf845462568aee360d.png
还没有评论,来说两句吧...