Bootstrap

Java Stream API 实战指南

Java Stream API 实战指南

Java 8 引入的 Stream API 极大地丰富了 Java 的集合操作,提供了一种函数式编程风格来处理集合数据。本文将深入探讨 Stream API 的基本概念、操作和实际应用案例,帮助你更好地理解和使用这一强大的工具。

Stream 操作概览

Stream API 允许我们以声明式的方式处理数据集合,其生命周期可以分为三个阶段:

  1. 获取 Stream 实例:从数组、集合等数据源获取 Stream。
  2. 中间操作:如过滤、排序、映射等,它们会返回一个新的 Stream 实例。
  3. 终止操作:如计数、求和或收集到新的集合,这些操作会产生最终结果。

Stream 管道

Stream 管道是中间操作和终止操作的组合。许多 Stream 操作返回一个新的 Stream,允许我们将操作链式调用,形成更大的管道。这种链式调用不仅使代码更简洁,还支持延迟执行和短路操作等优化。

如何从源获取 Stream 实例

Java 8 对集合和其他数据结构的 API 进行了增强,增加了创建 Stream 实例的方法。例如:

List<String> list = Arrays.asList("1", "2", "3");
Stream<String> stream = list.stream();

对于基本数据类型,Java 8 还提供了 IntStreamLongStreamDoubleStream 接口,以提高效率。

实际应用案例

打印列表中的所有元素

旧的命令式风格

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。

;