Java Stream API 实战指南
Java 8 引入的 Stream API 极大地丰富了 Java 的集合操作,提供了一种函数式编程风格来处理集合数据。本文将深入探讨 Stream API 的基本概念、操作和实际应用案例,帮助你更好地理解和使用这一强大的工具。
Stream 操作概览
Stream API 允许我们以声明式的方式处理数据集合,其生命周期可以分为三个阶段:
- 获取 Stream 实例:从数组、集合等数据源获取 Stream。
- 中间操作:如过滤、排序、映射等,它们会返回一个新的 Stream 实例。
- 终止操作:如计数、求和或收集到新的集合,这些操作会产生最终结果。
Stream 管道
Stream 管道是中间操作和终止操作的组合。许多 Stream 操作返回一个新的 Stream,允许我们将操作链式调用,形成更大的管道。这种链式调用不仅使代码更简洁,还支持延迟执行和短路操作等优化。
如何从源获取 Stream 实例
Java 8 对集合和其他数据结构的 API 进行了增强,增加了创建 Stream 实例的方法。例如:
List<String> list = Arrays.asList("1", "2", "3");
Stream<String> stream = list.stream();
对于基本数据类型,Java 8 还提供了 IntStream
、LongStream
和 DoubleStream
接口,以提高效率。
实际应用案例
打印列表中的所有元素
旧的命令式风格:
List<String> list = Arrays.asList("Apple", "Orange", "Banana");
for (String s : list) {
System.out.println(s);
}
新的声明式风格:
List<String> list = Arrays.asList("Apple", "Orange", "Banana");
list.forEach(s -> System.out.println(s));
计算列表中偶数的数量
旧的命令式风格:
List<Integer> list = Arrays.asList(3, 2, 12, 5, 6, 11, 13);
int count = 0;
for (Integer i : list) {
if (i % 2 == 0) {
count++;
}
}
System.out.println(count);
新的声明式风格:
List<Integer> list = Arrays.asList(3, 2, 12, 5, 6, 11, 13);
long count = list.stream()
.filter(i -> i % 2 == 0)
.count();
System.out.println(count);
求所有偶数的和
旧的命令式风格:
List<Integer> list = Arrays.asList(3, 2, 12, 5, 6, 11, 13);
int sum = 0;
for (Integer i : list) {
if (i % 2 == 0) {
sum += i;
}
}
System.out.println(sum);
新的声明式风格:
List<Integer> list = Arrays.asList(3, 2, 12, 5, 6, 11, 13);
int sum = list.stream()
.filter(i -> i % 2 == 0)
.mapToInt(Integer::intValue)
.sum();
System.out.println(sum);
通过这些实例,我们可以看到 Stream API 如何简化集合操作,并提高代码的可读性和效率。希望这篇文章能帮助你更好地理解和使用 Java Stream API。