「这是我参与2022首次更文挑战的第13天,活动详情查看:2022首次更文挑战」
前言
今天我们来学习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流分组功能,大家是否学会了呢,如果觉得有用,希望关注一下专栏哈。