前言:
Stream流是Java 8引入的功能,用于高效处理数据集合。它提供了丰富的操作方法,如过滤、映射、排序等,以简洁的方式处理数据。Stream流具有流式操作、懒执行和内部迭代的特点,能够简化代码并提高可读性。在接下来的文章中,我们将深入探讨Stream流的用法,包括创建流、筛选、转换和聚合操作等。通过学习Stream流,我们可以更好地利用Java的函数式编程特性,写出更加优雅和高效的程序
作者建议:学习知识在于深度理解,多动手、多动脑,总能更快地领悟。不要仅仅停留在阅读代码的层面,亲自动手敲打一遍,会带来更丰富的收获。通过实践,我们能够更深入地理解知识,掌握技能,并且在解决问题时更加得心应手。相信自己的能力,坚持不懈地实践,你将会取得更大的进步和成就。让学习成为一种习惯,让动手实践成为你提升的捷径,加油!你是最棒的!
目录
Stream流概论
Sream的操作
stream流创建
Stream的使用
中间操作:
终端操作
Stream流概论
Stream是Java8的新特性,Stream用来处理集合(数组,集合类),对数组,集合类 进行各种操作过(过滤,排序....)
Stream处理数据大体过程
数组/集合类 ---> 流 ----> 各种操作(过滤,排序) ---->结果(数组/集合类)
数组集合类 更偏向与存储数据(各种结构)
Stream中偏向于数据的操作(处理数据)
什么是流
简单的定义,就是"从支持数据操作的源,生成的元素序列"
理解:流我们可以简单理解为一个流水线工程,每一个岗位又不同的工作作用(流操作,也就是不同的方法),将这些流水线工程拼接在一起也就成为了一个商品(结果,我们所需要的).
流的大致操作:从一个数据源中获取数据,然后将数据源通过Stream流方法变成一个流,然后调取不同的方法,得到最终的结果
Sream的操作
stream流创建
- 最常用Stream方法(集合类常用)
- 静态的Stream.of()
- 数组流的创建Arrays.stream(数组对象);
代码示例:
ArrayList<String> arrayList = new ArrayList<>();arrayList.stream(); // 这样就把一个集合变成一个流,集合微数据源Stream<Integer> stream = Stream.of(1, 2, 3); // 返回的是一个数据流 并且拥有泛型int[] arr = new int[10];Arrays.stream(arr); //返回的是一个数据流
Stream的使用
Stream流接口可以分为二类:一类中间操作 一类终端操作
中间操作:会返回一个流,通过这种将一个个流连接到一起,这样就会形成一个流链条,从而满足我们的需求.最后通过终端操作,返回结果.(简单的理解:中间操作就是 流的各种数据处理)
终端操作:返回一个具体的流结果.(数组/集合/单值)
中间操作:
- filter:过滤流中的某些元素,
- sorted(): 自然排序,流中元素需实现Comparable接口
- distinct: 去除重复元素
- limit(n): 获取 n 个元素
- skip(n): 跳过 n 元素,配合limit(n)可实现分页
- map(): 将其映射成一个新的元素
代码示例:
filter:过滤流中的某些元素,
ArrayList<Integer> arrayList = new ArrayList<>();arrayList.add(1);arrayList.add(2);arrayList.add(3);arrayList.add(4);arrayList.add(3);arrayList.add(4);arrayList.add(5);arrayList.stream().filter(num -> num >= 3).forEach(System.out::println);
结果
3
4
3
4
5
sorted(): 自然排序,流中元素需实现Comparable接口
arrayList.stream().sorted().forEach(System.out::println); //默认升序System.out.println("-----------------");arrayList.stream().sorted((a, b) -> {return b-a;}).forEach(System.out::println);
结果
1
2
3
3
4
4
5
-----------------
5
4
4
3
3
2
1
终端操作
- forEach: 遍历流中的元素
- toArray:将流中的元素倒入一个数组
- Min:返回流中元素最小值
- Max:返回流中元素最大值
- count:返回流中元素的总个数
- Reduce:所有元素求和
- anyMatch:接收一个 Predicate 函数,只要流中有一个元素满足条件则返 回true,否则返回false
- allMatch:接收一个 Predicate 函数,当流中每个元素都符合条件时才返 回true,否则返回false
- findFirst:返回流中第一个元素
- collect:将流中的元素倒入一个集合,Collection或Map
Integer[] arr = new Integer[]{1, 2, 3, 3, 4, 5};Integer max = Arrays.stream(arr).distinct().max((a, b) -> {return a - b;}).get();Integer min = Arrays.stream(arr).distinct().min((a, b) -> {return a - b;}).get();Boolean aBoolean = Arrays.stream(arr).distinct().allMatch(a -> a > 3);long num = Arrays.stream(arr).distinct().count();System.out.println(num);Integer sum = Arrays.stream(arr).distinct().reduce((a, b) -> {return a + b;}).get();