什么是Stream(流)
是将我们的数据源(集合、数组等)进行一系列的中间操作,但不会改变我们的数据
注意:
1、Stream自己不会存储数据
2、不会改变源对象
3、Stream是延时的。会等到需要结果的时候才执行
Stream的操作三个步骤
1、得到一个stream
一个数据源获得一个流
2、中间操作
一个中间操作链,对数据源的数据进行处理
3、终止操作
一个终止操作,执行中间操作链,并产生结果
得到一个stream
1、通过conllection系列集合提过的stream()方法 或 parallelStream()
2、通过Array中的静态方法stream()获得数组流
3、通过Stream中的of方法
4、无限流 迭代、生成
@Test
public void test(){
//创建stream
//1
ArrayList<String> list = new ArrayList<>();
Stream<String> stream = list.stream();
//2
Student[] students = new Student[10];
Stream<Student> stream1 = Arrays.stream(students);
//3
Stream<String> aa = Stream.of("aa", "bb");
//4 迭代
Stream<Integer> iterate = Stream.iterate(0, (x) -> x + 2);
iterate.forEach(System.out::println);
//5 生成
Stream.generate(Math::random).forEach(System.out::println);
}
Stream中间操作
内部迭代,惰性求值
筛选与切片
filter:从流中排除元素
@Test
public void test(){
ArrayList<Student> students = new ArrayList<>();
students.add(new Student("张三1", 40, 1));
students.add(new Student("张三2", 20, 2));
students.add(new Student("张三3", 30, 3));
students.add(new Student("张三4", 40, 4));
//
students.stream().filter((student)->student.getAge()>30).forEach(System.out::println);
}
limit:截取操作
skip(n):返回一个扔掉前n个元素的流,若流中元素不足n个,则返回一个空值,
distinct:去重,通过hashcode和equals方法判断
映射
map:将元素转化为其他形式或用于提取信息。接收一个函数最为参数,该函数会被应用到每一个元素上,并将其映射成一个新的元素。
flatMap:将对个流合并为一个流
public void test(){
ArrayList<Student> students = new ArrayList<>();
students.add(new Student("张三1", 40, 1));
students.add(new Student("张三2", 20, 2));
students.add(new Student("张三3", 30, 3));
students.add(new Student("张三4", 40, 4));
students.stream().map((Student::getName)).forEach(System.out::println);
}
排序
sorted() :自然排序 comparable
sorted(comparator):定制
@Test
public void test(){
ArrayList<Student> students = new ArrayList<>();
students.add(new Student("张三1", 40, 1));
students.add(new Student("张三2", 20, 2));
students.add(new Student("张三3", 30, 3));
students.add(new Student("张三4", 40, 4));
students.stream().sorted((e1,e2)->{
if (e1.getAge()==e2.getAge()){
return Integer.compare(e1.getSno(),e2.getSno());
}else {
return Integer.compare(e1.getAge(),e2.getAge());
}
}).forEach(System.out::println);
}