Stream流
时间: 2025-06-20 07:50:21 浏览: 9
### 关于Stream流的使用方法
#### 什么是Stream流?
Stream 是 Java 中用于处理集合的一种高级抽象工具,它可以看作是一系列支持连续操作的数据管道[^3]。尽管 Stream 自身并不存储数据,但它可以从诸如 `Collection`、数组或其他数据源中获取数据,并对其进行一系列转换和计算。
---
#### 创建Stream的方式
可以通过多种方式创建 Stream 流:
1. **通过 Collection 接口的默认方法**
所有实现了 `Collection` 的类都可以直接调用 `.stream()` 方法来生成一个串行流,或者调用 `.parallelStream()` 来生成一个并行流。
2. **通过 Arrays 类**
可以利用 `Arrays.stream(array)` 将数组转化为 Stream 流。
3. **通过静态工厂方法**
利用 `Stream.of(elements...)` 静态方法可以直接创建一个包含指定元素的 Stream 流。
4. **通过 IO 文件读取**
使用 `Files.lines(path, charset)` 方法可以将文件中的每一行作为字符串元素加载到 Stream 流中[^2]。
---
#### Stream的主要操作分类
Stream 提供的操作分为两大类:**中间操作** 和 **终结操作**。
1. **中间操作 (Intermediate Operations)**
这些操作会返回一个新的 Stream 实例,允许链式调用。常见的中间操作包括但不限于:
- `filter(Predicate predicate)`:过滤掉不符合条件的元素[^4]。
- `map(Function mapper)`:将每个输入元素映射成另一个输出元素。
- `sorted(Comparator comparator)`:对流中的元素进行排序。
- `distinct()`:去除重复项。
2. **终结操作 (Terminal Operations)**
终结操作会触发实际的执行过程,并且一旦完成就无法再对该 Stream 调用其他方法。典型的终结操作如下:
- `forEach(Consumer action)`:逐一处理流中的每个元素[^4]。
- `collect(Collectors collector)`:收集结果并将它们存放到某种容器中(如 List 或 Map)。
- `reduce(BinaryOperator accumulator)`:累积计算流中的元素值。
- `count()`:统计流中有多少个元素。
需要注意的是,在执行完任意一种终结操作之后,原始 Stream 即被消耗完毕而失效[^1]。
---
#### 并行流ParallelStream的特点及其与普通Stream的区别
当面对大规模数据集时,采用 Parallel Streams 可能带来性能上的提升因为它能够自动把任务拆分成若干子任务并发运行然后再汇总结果。然而这同时也意味着某些副作用可能会因为线程间交互变得难以预测所以开发者需谨慎对待共享状态以及同步问题[^5]。
以下是对比两者的一个简单例子展示如何分别运用常规模式与并行机制实现相同的功能即打印列表里的名字:
```java
// 定义测试名单
List<String> names = Arrays.asList("Alice", "Bob", "Charlie");
// 使用标准序列化流程逐条显示姓名
names.stream().forEach(System.out::println);
// 同样效果但启用多核优势加速迭代速度
names.parallelStream().unordered().forEach(System.out::println);
```
请注意由于引入了无序选项(unordered),最终呈现次序可能不再保持原有排列顺序。
---
#### 示例代码片段——综合应用Filter与ForEach
下面给出一段完整的Java程序演示怎样结合使用 filter 和 forEach 对一组整数先做过滤后再依次输出满足特定条件的结果:
```java
import java.util.Arrays;
import java.util.List;
public class FilterAndForEachExample {
public static void main(String[] args) {
// 初始化待处理数值清单
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
// 应用流水线作业形式筛选偶数项目并通过Lambda表达式定义行为动作
numbers.stream()
.filter(n -> n % 2 == 0)
.forEach(n -> System.out.println("Even number: " + n));
}
}
```
此段脚本首先建立了一个含有十个自然数的小型队列;接着借助`.stream()`开启一条新的资料传输通道;随后施加一层逻辑检验器仅保留那些可除尽二余零者进入下一步骤;最后依靠匿名内部类别语法结构告知系统每当遇到符合条件的对象便立即予以报告说明其身份特征[^4]。
---
阅读全文
相关推荐
















