Java Stream流:这篇就够了!详细教程
Java 8 引入了 Stream API,使得处理集合数据变得更加简洁和高效。Stream 提供了一种对集合进行聚合操作的高效方式,支持顺序和并行操作。本文将详细介绍 Java Stream 流的基本概念、常用操作以及使用示例,帮助你快速上手。
一、Stream 的基本概念
Stream 是对数据源(如集合、数组等)进行聚合操作的工具。Stream 不存储数据,而是从数据源中按需获取数据。与集合不同,Stream 主要关注的是计算而不是存储,因此通过流的操作不会改变原有的数据结构。
Stream 可以通过以下方式创建:
- 从集合创建:
List<String> list = Arrays.asList("a", "b", "c"); Stream<String> stream = list.stream();
- 从数组创建:
Stream<Integer> stream = Arrays.stream(new Integer[]{1, 2, 3});
- 使用静态方法:
Stream<String> stream = Stream.of("a", "b", "c");
二、Stream 常用操作
Stream 提供了多种操作方法,常见的有:
- 中间操作(Intermediate Operations):返回一个新的 Stream,并且可以链式调用。中间操作是惰性求值,只有在终止操作被调用时才会执行。
filter(Predicate<T> predicate)
:过滤符合条件的元素。map(Function<T, R> mapper)
:将元素转换为另一种形式。-
sorted()
:对流进行排序。 -
终止操作(Terminal Operations):产生结果或者副作用,并结束流的处理。
collect(Collector<T, ?, R> collector)
:将流中的元素收集到集合。forEach(Consumer<T> action)
:对每个元素执行操作。reduce()
:对流中的元素进行聚合操作。
三、代码示例
下面的代码示例演示了如何使用 Stream API 进行常见的集合操作。
import java.util.*;
import java.util.stream.*;
public class StreamExample {
public static void main(String[] args) {
// 创建一个数字列表
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
// 1. 过滤出偶数并打印
System.out.println("偶数:");
numbers.stream()
.filter(n -> n % 2 == 0)
.forEach(System.out::println);
// 2. 对每个数字进行平方运算并收集到一个新列表中
List<Integer> squares = numbers.stream()
.map(n -> n * n)
.collect(Collectors.toList());
System.out.println("平方数列表:" + squares);
// 3. 计算偶数的总和
int sumOfEvens = numbers.stream()
.filter(n -> n % 2 == 0)
.reduce(0, Integer::sum);
System.out.println("偶数的总和:" + sumOfEvens);
// 4. 排序并输出
System.out.println("排序后的列表:");
numbers.stream()
.sorted()
.forEach(System.out::println);
}
}
代码解析
- 使用
filter()
方法从数字列表中提取偶数,并使用forEach()
打印出来。 - 使用
map()
对每个数字进行平方运算,结果通过collect()
方法收集到一个新的列表中。 - 使用
reduce()
计算偶数的总和。 - 最后,使用
sorted()
方法对原始列表进行排序并打印。
四、总结
Java Stream 流极大地方便了集合数据的处理,提供了一种声明式编程的风格,使代码更简洁。通过中间操作和终止操作的组合,开发者可以轻松实现复杂的数据处理逻辑。理解 Stream API 的基本概念和常用操作,将为你的 Java 编程增添不少便利。希望本文能帮助你快速掌握 Java Stream 流的使用!