Stream 流是 Java 8 引入的一种新特性,它允许你以声明性方式处理集合数据(如列表、集合等),提供了更简洁和功能强大的方式来操作数据。Stream 流的主要特点是能够处理数据序列,并支持函数式编程风格的操作。
1. Stream 的基本概念
- Stream:表示一个序列化的数据流,可以从集合、数组或 I/O 通道等中获取。
- 操作:Stream 提供了多种操作,包括过滤、映射、排序、聚合等。
- 惰性求值:Stream 操作通常是惰性执行的,意味着只有在需要结果时才会计算。
- 无存储:Stream 本身不存储数据,而是从数据源中动态计算数据。
2. Stream 的语法
Stream 操作通常分为两个阶段:创建和操作。
2.1 创建 Stream
你可以通过以下方式创建 Stream:
-
从集合创建:
List<String> list = Arrays.asList("a", "b", "c"); Stream<String> stream = list.stream(); -
从数组创建:
String[] array = {"a", "b", "c"}; Stream<String> stream = Arrays.stream(array); -
使用 Stream.of():
Stream<String> stream = Stream.of("a", "b", "c");
2.2 常用操作
Stream 支持许多操作,分为中间操作和终止操作。
中间操作
中间操作返回一个新的 Stream,通常是惰性求值。
-
filter:过滤符合条件的元素。
Stream<String> filtered = stream.filter(s -> s.startsWith("a")); -
map:将每个元素转换为另一种形式。
Stream<Integer> lengths = stream.map(String::length); -
sorted:对元素进行排序。
Stream<String> sorted = stream.sorted();
终止操作
终止操作会触发实际的计算,并返回结果。
-
forEach:对每个元素执行操作。
stream.forEach(System.out::println); -
collect:将 Stream 中的元素收集到集合中。
List<String> result = stream.collect(Collectors.toList()); -
reduce:对元素进行聚合。
Optional<String> concatenated = stream.reduce((s1, s2) -> s1 + s2);
3. 使用示例
下面是一个简单的示例,演示如何使用 Stream 流:
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
public class StreamExample {
public static void main(String[] args) {
List<String> names = Arrays.asList("Alice", "Bob", "Charlie", "David");
// 过滤以 'A' 开头的名字,并转换为大写
List<String> filteredNames = names.stream()
.filter(name -> name.startsWith("A"))
.map(String::toUpperCase)
.collect(Collectors.toList());
// 打印结果
filteredNames.forEach(System.out::println);
}
}
4. 总结
- Stream 是一种用于处理数据序列的 API,支持函数式编程风格。
- 它提供了多种操作,如过滤、映射、排序等,具有惰性求值的特性。
- Stream 操作通常分为中间操作和终止操作,中间操作返回新的 Stream,终止操作执行计算并返回结果。
使用 Stream 可以使代码更加简洁和可读,同时提高了处理集合数据的效率。