Stream
使用Stream API 对集合数据进行操作时,就类似于使用 SQL 执行的数据库查询。
Stream API 提供了一种高效且易于使用的处理数据的方式。
Stream 和 Collection 集合的区别
Collection 是一种静态的内存数据结构,而 Stream 是有关计算的。前者是主要面向内存,存储在内存中,后者主要是面向 CPU,通过 CPU 实现计算。
集合是存储数据,Stream 是计算数据的。
注意 :
- Stream 自己不会存储元素
- Stream 不会改变源对象,相反,他们会返回一个持有结果的新 Stream
- Stream 操作是延迟执行的,这意味着他们会等到需要结果的时候才执行
Stream 三个步骤
- 创建对象 :一个数据源(集合、数组等),获取一个流
- 中间操作 :一个中间操作链,对数据源的数据进行处理(过滤、映射等操作)
- 终止操作 :一旦执行终止操作,就执行中间的操作链,并产生结果,之后,不会再被使用
集合数据准备
创建一个 Student 实体
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Student {
private int id;
private String name;
private int age;
// 集合数据
public static List<Student> getStudents(){
List<Student> studentList = new ArrayList<>();
studentList.add(new Student(1,"tom",12));
studentList.add(new Student(2,"jack",32));
studentList.add(new Student(3,"job",23));
return studentList;
}
}
创建 Stream
方式一 :通过集合创建
/**
* 方式一 :集合方式创建
*/
@Test
public void test1(){
List<Student> students = getStudents();
// 获取一个顺序流(集合中的数据都按顺序来操作的)
Stream<Student> stream = students.stream();
// 获取一个并行流(集合中的数据是一起进行操作的)
Stream<Student> parallelStream = students.parallelStream();
}
方式二 :通过数组创建
/**
* 方式二 :数组方式创建
*/
@Test
public void test2(){
int[] nums = {1,2,3,4,5,6};
IntStream stream = Arrays.stream(nums);
}
方式三 :通过 Stream 的 of()
/**
* 通过 Stream 的 of()
*/
@Test
public void test3(){
Stream<Integer> stream = Stream.of(1, 2, 3);
}