它支持链式调用,方便
不会修改原始数据源,而是生成一个新的流或结果
中间操作不会立即执行,只有在终端操作触发时才会真正执行
以下是相关知识点:
Java 8 引入了 Stream API,它提供了一种高效且简洁的方式来处理集合数据。Stream 是一种抽象,它允许你以声明式的方式处理数据集合(如 List、Set 等)。Stream API 的设计灵感来源于函数式编程语言,并结合了 Java 的特性。
Stream 的生命周期分为三个阶段:
List list = Arrays.asList("a", "b", "c");
Stream stream = list.stream(); // 创建顺序流
Stream parallelStream = list.parallelStream(); // 创建并行流
String[] array = {"a", "b", "c"};
Stream stream = Arrays.stream(array);
Stream.of
Stream stream = Stream.of("a", "b", "c");
Stream.generate
:生成一个无限流。
Stream randomStream = Stream.generate(Math::random);
Stream.iterate
:基于初始值和递增规则生成一个无限流。
Stream evenNumbers = Stream.iterate(0, n -> n + 2);
中间操作会返回一个新的 Stream,它们是惰性的,只有在终端操作触发时才会执行。
filter
Stream numbers = Stream.of(1, 2, 3, 4, 5);
Stream filtered = numbers.filter(n -> n % 2 == 0); // 只保留偶数
map
Stream words = Stream.of("apple", "banana", "cherry");
Stream lengths = words.map(String::length); // 获取每个单词的长度
flatMap
List> nestedList = Arrays.asList(
Arrays.asList(1, 2),
Arrays.asList(3, 4)
);
Stream flatStream = nestedList.stream().flatMap(List::stream);
distinct
Stream numbers = Stream.of(1, 2, 2, 3, 3);
Stream distinctNumbers = numbers.distinct();
sorted
Stream numbers = Stream.of(3, 1, 2);
Stream sortedNumbers = numbers.sorted();
limit
和 skip
limit(n)
:截取前 n 个元素。skip(n)
:跳过前 n 个元素。
Stream numbers = Stream.of(1, 2, 3, 4, 5);
Stream limited = numbers.limit(3); // 取前 3 个元素
Stream skipped = numbers.skip(2); // 跳过前 2 个元素
终端操作会触发 Stream 的执行,并生成最终结果。
forEach
Stream words = Stream.of("hello", "world");
words.forEach(System.out::println);
collect
Stream words = Stream.of("a", "b", "c");
List list = words.collect(Collectors.toList());
reduce
Stream numbers = Stream.of(1, 2, 3, 4);
Optional sum = numbers.reduce((a, b) -> a + b); // 计算总和
anyMatch
、allMatch
和 noneMatch
anyMatch
:判断是否有任意一个元素满足条件。allMatch
:判断是否所有元素都满足条件。noneMatch
:判断是否没有任何元素满足条件。
Stream numbers = Stream.of(1, 2, 3, 4);
boolean anyEven = numbers.anyMatch(n -> n % 2 == 0); // 是否有偶数
count
Stream numbers = Stream.of(1, 2, 3, 4);
long count = numbers.count(); // 统计元素数量
findFirst
和 findAny
findFirst
:返回流中的第一个元素(如果存在)。findAny
:返回流中的任意一个元素(通常用于并行流)。
Stream numbers = Stream.of(1, 2, 3, 4);
Optional first = numbers.findFirst();
Stream 的中间操作是惰性的,只有在终端操作触发时才会真正执行。这种机制的优点包括:
findFirst
或 anyMatch
)可以在满足条件后立即停止。
List numbers = Arrays.asList(1, 2, 3, 4, 5);
int sum = numbers.parallelStream()
.mapToInt(Integer::intValue)
.sum();
Stream API 提供了一种强大而灵活的方式来处理集合数据,它的主要优势包括:
如果你需要处理复杂的集合操作(如过滤、映射、分组等),Stream API 是非常推荐的工具。