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()`
版权声明
本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。