Java Stream API 是 Java 8 引入的核心特性之一,它提供了一种高效且声明式的方式来处理集合数据。Stream 允许你将操作链接起来,形成一个流水线式的处理流程,极大地提高了代码的可读性和效率。
一、流的核心概念
1. 流的构成
- 数据源:可以是集合、数组、I/O 通道等。
- 中间操作:返回一个新的流(如
filter
,map
,sorted
)。 - 终端操作:触发计算并产生结果(如
collect
,forEach
,reduce
)。
2. 流的特性
- 不存储数据:流是数据的视图,不改变原始数据源。
- 惰性求值:中间操作不会立即执行,直到遇到终端操作。
- 一次性使用:流只能被消费一次,消费后需要重新创建。
二、创建流的多种方式
1. 从集合创建
import java.util.Arrays;
import java.util.List;
import java.util.stream.Stream;
public class StreamCreation {
public static void main(String[] args) {
// 集合转流
List<String> list = Arrays.asList("apple", "banana", "cherry");
Stream<String> stream = list.stream(); // 顺序流
Stream<String> parallelStream = list.parallelStream(); // 并行流
}
}
2.从数组创建
int[] numbers = {1, 2, 3, 4, 5};
IntStream intStream = Arrays.stream(numbers); // 基本类型流
3. Stream.of()
Stream<String> stringStream = Stream.of("a", "b", "c");
4.生成无限流
// 迭代生成
Stream<Integer> evenNumbers = Stream.iterate(0, n -> n + 2); // 0, 2, 4, 6...
// 随机数生成
Stream<Double> randoms = Stream.generate(Math::random);
5.从文件创建
try (Stream<String> lines = Files.lines(Paths.get("data.txt"))) {
lines.forEach(System.out::println);
} catch (IOException e) {
e.printStackTrace();
}
三、中间操作详解
中间操作返回新的流,支持链式调用,形成操作流水线。
1. 过滤(Filtering)
List<String> fruits = Arrays.asList("apple", "banana", "cherry", "date");
List<String> longFruits = fruits.stream()
.filter(fruit -> fruit.length() > 5) // 过滤长度>5的水果
.collect(Collectors.toList()); // [banana, cherry]