Java 中的流式操作
·
Java 中哪些数据结构支持流式操作,以及如何使用
1️⃣ 支持流式操作的数据结构
在 Java 8 及以上,实现了 java.util.Collection 接口的集合类 都可以生成流:
| 数据结构 | 支持方式 |
|---|---|
| List(ArrayList, LinkedList) | list.stream() / list.parallelStream() |
| Set(HashSet, TreeSet, LinkedHashSet) | set.stream() / set.parallelStream() |
| Queue(PriorityQueue, LinkedList) | queue.stream() |
| Deque(ArrayDeque, LinkedList) | deque.stream() |
注意:Map 不直接是 Collection,但可以通过 keySet、values 或 entrySet 生成流。
Map 流式操作方式
Map<String, Integer> map = Map.of("a",1,"b",2,"c",3);
// 遍历 key
map.keySet().stream().forEach(System.out::println);
// 遍历 value
map.values().stream().forEach(System.out::println);
// 遍历 entry
map.entrySet().stream().forEach(e -> System.out.println(e.getKey() + ":" + e.getValue()));
2️⃣ Stream 的生成方式
(1)从集合生成
List<String> list = List.of("apple", "banana", "cherry");
Stream<String> stream = list.stream(); // 顺序流
Stream<String> parallelStream = list.parallelStream(); // 并行流
(2)从数组生成
String[] arr = {"a","b","c"};
Stream<String> stream = Arrays.stream(arr);
(3)从 Map 生成
Map<String,Integer> map = Map.of("x",1,"y",2);
Stream<Map.Entry<String,Integer>> entryStream = map.entrySet().stream();
(4)通过 Stream.of()
Stream<String> stream = Stream.of("one","two","three");
(5)无限流(适合流式处理大数据)
Stream<Integer> infinite = Stream.iterate(0, n -> n + 1); // 0,1,2,...
Stream<Double> randomStream = Stream.generate(Math::random); // 随机数流
无限流通常要加上
limit(n)才能有限处理。
3️⃣ 流式操作分类
中间操作(Lazy,返回新 Stream)
| 操作 | 说明 |
|---|---|
map | 映射每个元素到新值 |
filter | 过滤元素 |
distinct | 去重 |
sorted | 排序 |
limit | 限制元素数量 |
skip | 跳过前 n 个元素 |
flatMap | 展平嵌套结构 |
终端操作(Trigger 执行,返回结果或副作用)
| 操作 | 说明 |
|---|---|
collect | 收集成集合或其他容器 |
toList() / toSet() | 收集为 List 或 Set |
forEach | 遍历处理 |
reduce | 聚合(求和、拼接等) |
count | 统计元素数量 |
anyMatch / allMatch | 条件匹配 |
4️⃣ 流式操作示例
(1)过滤 + 映射 + 收集
List<String> fruits = List.of("apple","banana","cherry","avocado");
List<String> result = fruits.stream()
.filter(f -> f.startsWith("a")) // 过滤
.map(String::toUpperCase) // 转大写
.toList(); // 收集
输出:
["APPLE", "AVOCADO"]
(2)处理 Map
Map<String,Integer> scores = Map.of("Tom",90,"Jerry",80,"Anna",95);
List<String> topStudents = scores.entrySet().stream()
.filter(e -> e.getValue() > 85)
.map(Map.Entry::getKey)
.toList();
输出:
["Tom", "Anna"]
(3)无限流示例
Stream<Integer> numbers = Stream.iterate(0, n -> n + 1);
List<Integer> first10Even = numbers
.filter(n -> n % 2 == 0)
.limit(10)
.toList();
输出:
[0,2,4,6,8,10,12,14,16,18]
5️⃣ 总结
-
集合类(List、Set、Queue)都可以流式操作。
-
Map 需要通过 keySet/values/entrySet 生成流。
-
Stream 分中间操作和终端操作:
- 中间操作可链式组合,不消耗结果(Lazy)。
- 终端操作触发执行,返回结果或副作用。
-
无限流和边读边处理可用于大数据场景(类似你大文件的流式解析)。
💡 建议:
- 如果要处理大文件或大集合,尽量 使用流式处理 + limit / filter / map,避免一次性占用大量内存。
更多推荐
所有评论(0)