Stream API概述
Stream API是Java 8引入的重要特性,它提供了一种高效且简洁的方式来处理集合数据。Stream不是数据结构,而是一种数据处理的高层抽象。
重要概念:Stream不会改变原集合,它返回一个新的Stream或结果。
Stream处理流程
创建Stream
→
中间操作
→
终端操作
创建Stream
集合、数组、Stream.of()
中间操作
filter/map/sorted/distinct
终端操作
collect/forEach/reduce
创建Stream
// 从集合创建
List<String> list = Arrays.asList("a", "b", "c");
Stream<String> stream = list.stream();
// 从数组创建
String[] array = {"x", "y", "z"};
Stream<String> stream2 = Arrays.stream(array);
// 直接创建
Stream<Integer> stream3 = Stream.of(1, 2, 3, 4, 5);
中间操作
1. filter - 过滤
根据条件过滤元素:
List<Integer> evens = numbers.stream()
.filter(n -> n % 2 == 0)
.collect(Collectors.toList());
2. map - 转换
将元素转换为另一种形式:
List<String> upper = names.stream()
.map(String::toUpperCase)
.collect(Collectors.toList());
3. sorted - 排序
List<Integer> sorted = numbers.stream()
.sorted()
.collect(Collectors.toList());
4. distinct - 去重
List<Integer> unique = numbers.stream()
.distinct()
.collect(Collectors.toList());
终端操作
1. collect - 收集
将流转换为集合或字符串:
// 收集为List
List<String> list = stream.collect(Collectors.toList());
// 收集为Set
Set<String> set = stream.collect(Collectors.toSet());
// 字符串连接
String joined = stream.collect(Collectors.joining(", "));
2. reduce - 聚合
int sum = numbers.stream()
.reduce(0, Integer::sum);
3. forEach - 遍历
stream.forEach(System.out::println);
常用终端操作汇总
| 操作 | 说明 |
|---|---|
| collect() | 将流转换为集合或字符串 |
| toList()/toSet() | 收集为List/Set |
| joining() | 连接为字符串 |
| count() | 统计元素个数 |
| sum()/average() | 求和/平均值 |
| max()/min() | 最大/最小值 |
| forEach() | 遍历每个元素 |
| findFirst() | 返回第一个元素 |
小结
- Stream是数据处理的高层抽象,不存储数据
- Stream操作分为中间操作(返回Stream)和终端操作(返回结果)
- 常用中间操作:filter、map、sorted、distinct
- 常用终端操作:collect、forEach、reduce、count
- Stream是惰性执行的,只有遇到终端操作才会真正执行