Java——Stream流式编程
本文记录一下Java8新特性Stream流式编程的使用。
一、什么是Stream流式操作
Stream流式操作,就是学习java.util.stream
包下的API,Stream不同于java的输入输出流,是实现对集合
(Collection)的复杂操作,例如查找
、替换
、过滤
和映射数据
等,集合是一种静态的数据结构,存储在内存
中,而Stream是用于计算
的,通过CPU实现计算,因此可以认为Stream就是处理集合数据的各种算法流程。
二、Stream流式操作流程
Stream流式操作主要有 3 个步骤:
-
创建Stream对象
:通过一些数据源创建流对象 -
中间操作
:对数据源的数据进行处理(过滤、排序等) -
终止操作
:一旦执行终止操作,就执行中间的链式操作
,并产生结果。
三、3个步骤详细解析
1. 创建Stream对象
创建stream流对象有以下几种方式:
- 通过
集合
创建 Stream - 通过
数组
创建 Stream - 通过 Stream 的
of()
方法
Stream流是
不会改变源对象
的,而是返回一个新的持有结果的Stream
2. 中间操作
当使用Java中的Stream进行流式操作时,可以使用各种中间操作方法
来对流中的元素进行处理。下面介绍一下常用的中间方法:
1. filter(Predicate)
根据给定的条件(Predicate)过滤流中的元素,只保留符合条件
的元素。
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
List<Integer> evenNumbers = numbers.stream()
.filter(num -> num % 2 == 0)
.collect(Collectors.toList()); //[2, 4]
2. map(Function)
将流中的每个元素映射
为另一个元素
,生成一个新的流。
List<String> names = Arrays.asList("Alice", "Bob", "Charlie");
List<Integer> nameLengths = names.stream()
.map(String::length) //映射为长度
.collect(Collectors.toList()); // [5, 3, 7]
3. sorted()
对流中的元素进行排序,默认是自然顺序
排序,也可以传入Comparator
进行自定义排序。
List<Integer> numbers = Arrays.asList(3, 1, 4, 1, 5, 9, 2, 6, 5);
List<Integer> sortedNumbers = numbers.stream()
.sorted()
.collect(Collectors.toList()); // [1, 1, 2, 3, 4, 5, 5, 6, 9]
4. distinct()
去除流中重复
的元素,得到一个去重后的新流。
List<Integer> numbers = Arrays.asList(1, 2, 2, 3, 3, 3, 4, 4, 4, 4);
List<Integer> distinctNumbers = numbers.stream()
.distinct()
.collect(Collectors.toList());// [1, 2, 3, 4]
5. limit(long)
截取流中的前几个元素
,生成一个新的流。
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
List<Integer> limitedNumbers = numbers.stream()
.limit(3)
.collect(Collectors.toList());// [1, 2, 3]
6. skip(long)
跳过
流中的前几个元素,生成一个新的流。
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
List<Integer> skippedNumbers = numbers.stream()
.skip(2)
.collect(Collectors.toList());// [3, 4, 5]
上面的都是Stream中常用的中间操作方法,通过这些方法可以对流中的元素进行过滤、映射、排序、去重、截取等操作。
3. 终止操作
Stream的终止操作用于触发流的计算
(延迟执行)并得到最终的结果
,下面介绍一下流式操作常用的终止方法。
1. forEach(Consumer)
对流中的每个元素
执行指定的操作
。
List<String> names = Arrays.asList("Alice", "Bob", "Charlie");
names.stream()
.forEach(System.out::println);//控制台输出每个字符串
2. collect(Collector)
将流中的元素收集到一个集合
中。可以通过Collectors
工具类提供的方法来实现不同类型的收集操作
。
List<String> names = Arrays.asList("Alice", "Bob", "Charlie");
List<String> collectedNames = names.stream()
.collect(Collectors.toList());// 将流中的元素收集到List中
3. reduce(BinaryOperator)
对流中的元素进行归约操作
,得到一个最终的结果。
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
int sum = numbers.stream()
.reduce(0, Integer::sum); // 对流中的元素求和
4. count()
返回流中元素的个数
。
List<String> names = Arrays.asList("Alice", "Bob", "Charlie");
long count = names.stream()
.count();// 返回3
5. anyMatch(Predicate)
判断流中是否存在任意一个
元素满足给定条件
。
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
boolean hasEvenNumber = numbers.stream()
.anyMatch(num -> num % 2 == 0);// 返回true,因为流中存在偶数元素
6. allMatch(Predicate)
判断流中的所有元素
是否都满足给定条件
。
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
boolean allPositive = numbers.stream()
.allMatch(num -> num > 0);// 返回true,因为流中所有元素都是正数
以上都是是Stream中常用的终止操作方法。
总结
本文记录一下Java8新特性Stream流式编程的使用,包括创建流、流的中间操作和流的终止操作常用方法。
希望对看到本文的你有帮助。
上一篇 Java——函数式接口 |
记得点赞收藏哦!!!
| 下一篇 java内部类最全详解(成员内部类、局部内部类、匿名内部类、静态内部类)!!! |