Java 8 Stream API 深入解析:函数式编程的利器
在 Java 8 引入的众多特性中,Stream API 是最具革命性的工具之一,它让我们可以以声明式的方式处理集合数据,显著提升了代码的可读性和表达力。本文将从基础概念、核心操作、实际示例到性能注意事项,带你全面掌握 Stream API。
一、什么是 Stream?
Java 中的 Stream
是对集合对象功能的增强,它并不存储数据,而是定义了对数据的操作流程,具有以下特点:
- 声明式:避免冗长的
for
循环。 - 可组合:通过链式调用组合多个操作。
- 惰性求值:中间操作不会立即执行,只有终端操作才会触发流的遍历。
- 可并行:轻松使用并行流提升性能。
二、Stream 的分类
- 顺序流(Sequential Stream):默认创建方式,单线程。
- 并行流(Parallel Stream):通过多线程并发执行,提高性能。
List<String> list = Arrays.asList("A", "B", "C");
list.stream(); // 顺序流
list.parallelStream(); // 并行流
三、Stream 的创建方式
1. 从集合创建
List<String> list = Arrays.asList("Java", "Python", "C++");
Stream<String> stream = list.stream();
2. 从数组创建
int[] nums = {
1, 2, 3, 4};
IntStream intStream = Arrays.stream(nums);
3. 使用 Stream.of()
Stream<String> stream = Stream.of("a", "b", "c");
4. 使用无限流
Stream<Integer> infinite = Stream.iterate(0, n -> n + 2).limit(5); // [0, 2, 4, 6, 8]
四、Stream 的核心操作
Stream 操作分为两类:
- 中间操作(Intermediate):返回新的 Stream,可继续链式调用。
- 终端操作(Terminal):触发流的处理,返回结果或副作用。
1. 过滤(filter)
List<String> result = list.stream()
.filter(s -> s.length() > 3)
.collect(Collectors.toList());
2. 映射(map / flatMap)
List<Integer> lengths = list.stream()
.map(String::length)
.collect(Collectors.toList());
List<String> words = Arrays.asList("hello world", "java stream");
List<String> chars = words.stream()
.flatMap(s -> Arrays.stream(s.split(" ")))
.collect(Collectors.toList()); // ["hello", "world", "java", "stream"]
3. 去重(distinct)
Stream