前言
今天主要聊起的是如何使用 stream 流,关于它为什么被引入,有什么样的优势,还有一些平时未曾注意到的知识点的话,就在下一次再讲吧~
能基础的使用,是深入了解它的一个基础吧,我觉得~
在本文中,你将会看到Stream API支持的许多操作。这些操作能让你快速完成复杂的数据查询,如筛选、切片、映射、查找、匹配和归约。
一、筛选和切片
1.1、筛选 filter
filter 会接受一个 Predicate 接口的参数,其本质就是一个布尔值函数(官方称为谓词,说成白话,即为一个布尔值函数)
准备好的数据~
static List<Student> students = new ArrayList<>();
static {
students.add(new Student("学生A", "大学1", 18));
students.add(new Student("学生A", "大学1", 18));
students.add(new Student("学生A", "大学1", 18));
students.add(new Student("学生A", "大学1", 18));
students.add(new Student("学生B", "大学1", 18));
students.add(new Student("学生C", "大学1", 19));
students.add(new Student("学生D", "大学2", 20));
students.add(new Student("学生E", "大学2", 21));
students.add(new Student("学生F", "大学2", 20));
students.add(new Student("学生G", "大学3", 22));
students.add(new Student("学生H", "大学3", 23));
students.add(new Student("学生I", "大学3", 19));
students.add(new Student("学生J", "大学4", 20));
}
1、从中筛选出小于20的学生们组成一个新的集合
jdk 8 之前的写法:
List<Student> result = new ArrayList<>();
for (Student student : students) {
if (student.getAge() < 20) {
result.add(student);
}
}
Jdk 8 及之后的写法:使用stream流操作
/**
* 选出小于20的学生组成一个集合
*
* @param students
*/
private static List<Student> selectAgeLt18(List<Student> students) {
// 最基础的写法, filter的参数是一个 Predicate,而它是一个FunctionalInterface 式的接口, 唯一的接口就是表示一个参数的谓词(布尔值函数)。
// List<Student> list = students.stream().filter(new Predicate<Student>() {
// @Override
// public boolean test(Student student) {
// return student.getAge()<20;
// }
// }).collect(Collectors.toList());
// 因此可以简化写成 以下这种写法
// List<Student> list = students.stream().filter(student -> {
// return student.getAge() < 20;
// }).collect(Collectors.toList());
//又因为filter 的参数实际上是一个lambda表达式,当只有一条返回语句时,又可以省略大括号和return
List<Student> list = students.stream().filter(student -> student.getAge() < 20).collect(Collectors.toList());
return list;
}
1.2、去重 distinct
distinct()它会返回一个元素各异(根据流所生成元素的 hashCode和equals方法实现)的流。
jdk 8之前对集合的一些去重方式
/**
* 去重操作ÿ