【Stream】

本文深入探讨了Java Stream API的核心概念,包括其延迟执行特性、中间操作和终端操作的分类,以及短路与非短路操作的区别。通过实例展示了如何通过集合、数组和Stream静态方法创建流,并通过中间操作构建管道。理解这些概念对于提升Java编程效率至关重要。

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

1、stream不存储数据,而是按照特定的规则对数据进行计算,一般会输出结果;
2、stream不会改变数据源,通常情况下会产生一个新的集合;
3、stream具有延迟执行特性,只有调用终端操作时,中间操作才会执行;
4、对stream操作分为终端操作和中间操作
终端操作:会消费流,这种操作会产生一个结果的,如果一个流被消费过了,那它就不能被重用的。
中间操作:中间操作会产生另一个流。因此中间操作可以用来创建执行一系列动作的管道。一个特别需要注意的点是:中间操作不是立即发生的。相反,当在中间操作创建的新流上执行完终端操作后,中间操作指定的操作才会发生。所以中间操作是延迟发生的,中间操作的延迟行为主要是让流API能够更加高效地执行。
5、stream不可复用,对一个已经进行过终端操作的流再次调用,会抛出异常。

Stream操作分类


Stream的操作可以分为两大类:中间操作、终结操作

中间操作可分为:

无状态(Stateless)操作:指元素的处理不受之前元素的影响
有状态(Stateful)操作:指该操作只有拿到所有元素之后才能继续下去


终结操作可分为:

短路(Short-circuiting)操作:指遇到某些符合条件的元素就可以得到最终结果
非短路(Unshort-circuiting)操作:指必须处理完所有元素才能得到最终结果

流的创建

  • 通过 java.util.Collection.stream() 方法用集合创建流
List<String> list = Arrays.asList("hello","world","stream");
//创建顺序流
Stream<String> stream = list.stream();
//创建并行流
Stream<String> parallelStream = list.parallelStream();
  • 使用java.util.Arrays.stream(T[] array)方法用数组创建流
String[] array = {"h", "e", "l", "l", "o"};
Stream<String> arrayStream = Arrays.stream(array);
  • Stream的静态方法:of()、iterate()、generate()
Stream<Integer> stream1 = Stream.of(1, 2, 3, 4, 5, 6);
 
Stream<Integer> stream2 = Stream.iterate(0, (x) -> x + 2).limit(3);
stream2.forEach(System.out::println);
 
Stream<Double> stream3 = Stream.generate(Math::random).limit(3);
stream3.forEach(System.out::println)
 
 
//输出结果如下:
 
0
2
4
0.9620319103852426
0.8303672905658537
0.09203215202737569

03-08
### Java Stream 编程概念 Java流式编程(Stream API)是在Java 8中引入的一种函数式编程特性,专门用于处理集合、数组等数据源中的元素序列[^1]。通过这种API可以实现更加简洁、高效以及易于阅读的数据操作。 #### 创建Stream对象的方法 创建`Stream`实例有多种途径: - **从Collection接口派生类获取**:可以直接调用诸如列表(`List`)这样的集合类型的`stream()`方法来获得对应的流对象。 ```java List<String> list = List.of("a", "b", "c"); Stream<String> stream = list.stream(); ``` - **基于数组构建**:也可以借助于`Arrays.stream(T[])`静态工厂方法由给定的一维数组转换成相应的流形式。 ```java Stream<String> s = Arrays.stream(new String[]{"A"}); ``` 上述两种方式本质上相似,在内部都是为了方便开发者能够快速地将现有的容器结构转化为支持链式调用特性的流模式来进行后续的操作[^2]。 #### 数据筛选与收集案例 对于具体的使用场景来说,比如想要从未知大小的颜色字符串列表里挑选特定颜色并最终形成新的列表返回,则可以通过如下代码片段完成此需求: ```java import java.util.Arrays; import java.util.List; import java.util.stream.Collectors; public class ColorFilterExample { public static void main(String[] args) { List<String> strList = Arrays.asList("green", "red", "blue", "black", "yellow"); // 过滤条件为只保留绿色(green)或红色(red)的项,并将其重新组合成一个新的列表 List<String> result = strList.stream() .filter(s -> s.equals("green") || s.equals("red")) .collect(Collectors.toList()); System.out.println(result); // 控制台输出:[green, red] } } ``` 这段程序展示了如何利用`.stream().filter(...).collect(...)`这一系列流畅式的语法糖衣包裹下的强大功能——即先定义好输入源头(这里是`strList`),接着指定过滤逻辑(仅允许满足一定条件的对象通过),最后决定这些经过加工后的实体应该被怎样汇总起来供下一步骤继续消费或是作为整个过程的结果呈现出来[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值