前言
今天我们来学习JDK8中的stream中的分组函数如何使用,通过stream流对集合数据进行一个分组Map,下面我们就一起来看看吧。
JDK8之stream流的使用:分组
其实分组在日常开发过程中,返回Map类型的情况也是不少的,比如我们要将集合中的值通过年龄的不同分成两组,让我们在下面的示例中学习一下吧。
@Data @AllArgsConstructor public class Test { private String name; private Integer age; public static void main(String[] args) { List<Test> list = new ArrayList<>(); list.add(new Test("张三", 1)); list.add(new Test("张四", 2)); list.add(new Test("张五", 3)); list.add(new Test("张六", 4)); Map<String, List<Test>> collect = list.stream().collect(groupingBy(Test::getName)); System.out.println(collect); } }
上述代码会得到一个Map集合,执行结果如下:
{张四=[Test(name=张四, age=2)], 张三=[Test(name=张三, age=1)], 张六=[Test(name=张六, age=4)], 张五=[Test(name=张五, age=3)]}
原理即是Collectors.groupingBy方法,返回一个Map集合。
当然,如果我现在想进行多级分组的话,这个时候如何做呢?
还是要接着说groupingBy方法,直接对其进行多重嵌套即可,让我们来看看下面的示例代码吧:
public static void main(String[] args) { List<Test> list = new ArrayList<>(); list.add(new Test("张三", 1)); list.add(new Test("张四", 2)); list.add(new Test("张五", 3)); list.add(new Test("张六", 4)); Map<String, Map<String, List<Test>>> collect = list.stream().collect(groupingBy(Test::getName, groupingBy(test -> { if (test.age.equals("1")) { return "update1"; } else { return "update2"; } }))); System.out.println(collect); }
上述代码,执行结果如下:
{张四={update2=[Test(name=张四, age=2)]}, 张三={update2=[Test(name=张三, age=1)]}, 张六={update2=[Test(name=张六, age=4)]}, 张五={update2=[Test(name=张五, age=3)]}}
通过groupingBy返回不同分组的数据,由此就能得到一个嵌套Map的Map集合,挺绕嘴,但是通过获取不同分组的值即可得到想要的值了。
总结
今天我们学习了JDK8中的stream流分组功能,大家是否学会了呢,如果觉得有用,希望关注一下专栏哈。