java之Stream简介说明
下文笔者讲述java中Stream流的简介说明,如下所示
包括三个阶段
例
Stream(流)简介
在Java中,Stream(流)是
从Java 8开始引入一个重要特性(位于`java.util.stream`包)
它提供一种高效且声明式的处理集合数据的方式
Stream 并不是用于存储数据的数据结构
而是用于对集合进行一系列链式操作(如过滤、映射、排序等)工具
Stream特点
-不存储数据:Stream只是
数据源(如 Collection、数组等)视图
-函数式编程风格:支持链式调用,
代码简洁清晰
-惰性求值(Lazy Evaluation):中间操作不会立即执行,
直到遇到终端操作才会触发实际计算。
-可并行处理:通过 `parallelStream()`
支持并行处理,
提高大数据量下的性能。
-一次消费:一个 Stream 只能被消费一次,
不能重复使用
Stream基本流程
完整Stream 操作通常包括三个阶段
1.获取流 2.中间操作(Intermediate Operations) 3.终端操作(Terminal Operation)例
list<String> filtered = list.stream() .filter(s -> s.startsWith("A")) // 中间操作 .map(String::toUpperCase) // 中间操作 .limit(5) // 中间操作 .toList(); // 终端操作
常见操作分类
1.获取Stream方式
| 数据源类型 | 获取方式 |
| 集合(Collection) | `collection.stream()` 或 `parallelStream()` |
| 数组 | `Arrays.stream(array)` 或 `Stream.of(array)` |
| 静态方法生成 | `Stream.of("a", "b")`, `Stream.empty()` |
| 文件读取 | `Files.lines(path)` |
2.中间操作(返回 Stream)
| 方法名 | 描述 |
| [filter(Predicate)] | 过滤符合条件的元素 |
| `map(Function)` | 对每个元素做映射转换 |
| `flatMap(Function)` | 将每个元素映射为多个元素,合并成一个流 |
| `distinct()` | 去重 |
| `sorted()` / `sorted(Comparator)` | 排序 |
| `peek(Consumer)` | 查看元素,调试用 |
| `limit(n)` | 截断流,只保留前 n 个元素 |
| `skip(n)` | 跳过前 n 个元素 |
3.终端操作(触发实际计算)
| 方法名 | 描述 |
| `forEach(Consumer)` | 遍历所有元素 |
| `forEachOrdered(Consumer)` | 有序遍历 |
| `collect(Collector)` | 收集结果到容器(如 List、Map 等) |
| `reduce(BinaryOperator)` | 归约操作(如求和、最大值) |
| [count()] | 返回元素数量 |
| `anyMatch(Predicate)` | 是否至少有一个匹配 |
| `allMatch(Predicate)` | 是否全部匹配 |
| `noneMatch(Predicate)` | 是否没有匹配 |
| `findFirst()`/`findAny()` | 获取第一个或任意元素 |
Collectors工具类常用方法(配合`collect()`使用)
| 方法 | 功能 |
| `Collectors.toList()` | 收集为 List |
| `Collectors.toSet()` | 收集为 Set |
| `Collectors.toMap(keyMapper, valueMapper)` | 收集为 Map |
| `Collectors.groupingBy(Function)` | 按某属性分组 |
| `Collectors.partitioningBy(Predicate)` | 按条件分区 |
| `Collectors.joining()` | 字符串拼接 |
| `Collectors.summarizingInt/Long/Double()` | 统计信息(如平均值、总数等) |
1.简单筛选与收集
List<String> filtered = list.stream()
.filter(s -> s.length() > 3)
.map(String::toUpperCase)
.toList();
2.分组统计
Map<Character, List<String>> grouped = list.stream()
.collect(Collectors.groupingBy(s -> s.charAt(0)));
3.求最大值、最小值
Optional<Integer> max = numbers.stream().max(Integer::compareTo);
4.字符串拼接
String result = list.stream().collect(Collectors.joining(", "));
Stream注意事项
-不可变性:Stream 不会修改原始集合,
所有操作返回新结果 -只能消费一次:一旦执行了终端操作,
该Stream 不可再用 -避免副作用:中间操作应尽量无副作用,
尤其是并行流中容易引发问题 -并行流慎用:适用于 CPU 密集型任务,
默认使用`ForkJoinPool.commonPool()`
版权声明
本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。


