Java8-Stream流处理

本文介绍了Java8中新增的Stream API特性,详细解释了Stream如何通过串行与并行方式处理集合数据,提供了多种Stream创建方式及操作类型的实例,包括中间件式、终点式和短路式操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Java8中的Stream是对与集合对象有所加强的新特性,专注于集合对象进行各种非常便利,高效的聚合操作,同时提供串行与并行两种模式的汇聚操作,使用了fork/join并行方式来拆分任务、加速处理过程。注意,这里的stream与原先的文件I/O流没有必然关系,是在Java8中的新内容。

Stream有时类似于一个迭代器,但是相比原来的Iterator串行命令式的执行过程,stream通过并行方式去便利,遍历时stream数据会被分成多段,其中每一段都在不同的线程中进行处理,然后归并统一。


生成Stream的方式
  • 从Collection集合获取
list.stream()
  • 从BufferedReader获取
 java.io.BufferedReader.lines()
  • 静态工厂、自己构建

流的几种操作类型
  1. Intermediate 中间件式
    一个流的后面可以跟多个中间件式的操作,其目的主要是打开流,做出某种程度的数据映射、过滤,然后返回一个新流,交给下一步操作。
List<Integer> numbers = Arrays.asList(1,2,3,4,5,6,7,8,9);
System.out.println(
                numbers.stream()              //获取流
                        .filter(n -> n%2==0)  //Intermediate操作
                        .findFirst());       //Terminal操作
  1. Terminal 终点式
    一个流只能有一个终点式操作,当这个操作执行后,就表示流被用光了,无法再次进行其他的操作。终点式操作的执行,才会真正开始流的遍历操作,并生成一个side effect。

  2. short-circuiting 短路式
    这个操作类型与上两个并存,主要表示以下两种模式:
    对于一个中间件式操作,若接受一个无限大的stream,则返回一个有限的;
    对于一个终点式操作,若他接受一个无限大的stream,能在有限时间内计算出结果;


常用的构造流的方式
Stream stream = Stream.of("a","b","c");
stream = Arrays.stream(strArray);
stream = list.stream();
已提供的包装类型流
  • IntStream
  • LongStream
  • DoubleStream

可帮助在使用过程中减少装箱/拆箱的消耗


流的操作
1. map/flatmap
把inputStream的每个元素,映射成outputStream的另一个元素
2. filter
对原Stream的元素进行测试,通过的保存下来继续向下流
3. forEach
接受第一个lambda表达式为流中的每个元素去执行
4. reduce
把Stream的元素组合起来,它有提供一个初始值,然后依照运算规则,与前面的Stream的第一个,第二个...第n个元素进行组合
5. limit/skip
limit返回流的前n个元素,skip为扔掉流的前n个元素
6. sorted
排序
7. min/max/distinct
返回流的最小值/最大值/平均值
8. Match

allMatch:判断流中全部元素是否符合传入的predicate,符合返回true
anyMatch:判断流中有无元素是否符合传入的predicate,符合返回true
noneMatch:判断流中全部元素是否符合传入的predicate,不符合返回true

在实现上,match相关方法不需要遍历全部元素,只要有一个元素不满足断言就退出,skip余下的元素


用Collectors来进行集合的reduction操作

主要作用就是降低集合与流之间的简化、转化等操作的复杂度,实用性大,例如:

list.collect(Collectors.toList());

collect作为一个Terminal方法一般放在最后。

### Java Stream API 使用教程 #### 一、Stream API简介 Java 8引入的Stream API是一项革新性功能,旨在为集合数据处理提供一种声明式的编程方式。这不仅让代码更为简洁优雅,而且提升了性能表现[^1]。 #### 二、创建Stream实例的方法 可以通过多种途径获取Stream对象: - **从Collection集合转换** ```java List<String> list = Arrays.asList("apple", "banana", "orange"); Stream<String> streamFromList = list.stream(); ``` - **数组转Stream** ```java String[] fruitsArray = {"apple", "banana", "orange"}; Stream<String> streamFromArray = Arrays.stream(fruitsArray); ``` - **通过Stream静态方法构建** ```java Stream<Integer> integerStream = Stream.of(1, 2, 3, 4, 5); ``` #### 三、中间操作与终端操作 Stream支持一系列丰富的中间操作用于过滤、映射等预处理工作;而终端操作则负责触发整个水线执行并返回最终结果。 ##### 中间操作示例 - 过滤特定条件的数据项 ```java streamFromList.filter(s -> s.startsWith("a")); ``` 此段代码会筛选出所有以字母'a'开头字符串组成的新的[^2]。 - 映射元素至其他形式 ```java streamFromList.map(String::toUpperCase); ``` 上述语句能够把原列表里的每一个单词都变成大写版本的新[^3]。 ##### 终端操作举例 - 收集结果到新容器内 ```java List<String> result = streamFromList.collect(Collectors.toList()); ``` 这段程序将会把经过前面各种变换后的元素收集起来存放到一个新的`List`当中去。 - 计算总数目 ```java long count = streamFromList.count(); ``` 该命令用来统计当前中有多少个条目存在。 #### 四、常见组合模式展示 下面给出一段综合运用了多个特性的例子来说明如何灵活应用这些概念完成实际任务: 假设有一个整数序列想要找出其中所有的偶数并将它们平方之后再求和。 ```java int sumOfSquares = IntStream.rangeClosed(1, 10) // 创建范围内的IntStream .filter(n -> n % 2 == 0) // 只保留偶数值 .map(n -> n * n) // 将其各自乘方得到平方值 .sum(); // 所有项目相加得出总和 System.out.println(sumOfSquares); // 输出计算所得的结果 ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值