Java 8 引入了 Stream API,这是一个高级的、用于处理数据的新抽象。Stream API 让你可以以声明式方式处理数据集合(包括数组、集合等)。使用 Stream API,你可以利用多核体系结构,轻松编写出高性能的数据并行处理代码。
Stream 基础用法
创建 Stream
// 从集合创建
List<String> list = Arrays.asList("a", "b", "c");
Stream<String> stream = list.stream();
// 从数组创建
String[] array = new String[]{"a", "b", "c"};
Stream<String> streamFromArray = Arrays.stream(array);
// 使用 Stream.of
Stream<String> streamOf = Stream.of("a", "b", "c");
// 创建空 Stream
Stream<Object> emptyStream = Stream.empty();
中间操作
中间操作是延迟执行的,它们只有在终端操作触发时才执行。它们通常用于转换或过滤数据。
// filter
stream.filter(s -> s.startsWith("a"))
// map
stream.map(s -> s.toUpperCase())
// sorted
stream.sorted()
// limit
stream.limit(10)
// distinct
stream.distinct()
终端操作
终端操作会触发中间操作的执行,并且产生结果或副作用。
// forEach
stream.forEach(System.out::println);
// collect
List<String> filteredList = stream.filter(s -> s.startsWith("a"))
.collect(Collectors.toList());
// match
boolean allMatch = stream.allMatch(s -> s.startsWith("a"));
boolean anyMatch = stream.anyMatch(s -> s.startsWith("a"));
boolean noneMatch = stream.noneMatch(s -> s.startsWith("a"));
// count
long count = stream.count();
// reduce
Optional<String> concatenated = stream.reduce((a, b) -> a + b);
并行 Stream
Stream API 可以非常容易地处理并行操作。只需要调用 parallelStream()
方法或 parallel()
方法,就可以将流转换成并行流。
List<String> list = Arrays.asList("a", "b", "c", "d", "e");
// 创建并行流
Stream<String> parallelStream = list.parallelStream();
// 从普通流创建并行流
Stream<String> parallel = list.stream().parallel();
// 使用并行流进行操作
long count = parallel.filter(s -> s.startsWith("a")).count();
Stream 示例
下面是一个使用 Stream API 的实际例子,它展示了如何使用不同的 Stream 操作来处理集合。
List<String> myList = Arrays.asList("a1", "a2", "b1", "c2", "c1");
myList.stream() // 创建流
.filter(s -> s.startsWith("c")) // 过滤以"c"开头的字符串
.map(String::toUpperCase) // 转换每个元素到大写
.sorted() // 排序
.forEach(System.out::println); // 打印每个元素
// 输出:
// C1
// C2
注意事项
- Stream 是一次性的。一旦你进行了终端操作,流就会被消耗掉,不能再被使用了。
- Stream 操作不会改变原始数据源,它们只是在原始数据源上提供了一个计算视图。
- 使用并行流时应该小心,因为它可能涉及到线程安全问题,特别是当你使用共享变量或有状态的中间操作时。
- Stream API 是用于处理集合的强大工具,但并不是所有情况下都比传统的集合处理方式更好。在使用 Stream API 之前,应该考虑到代码的清晰性、可维护性和性能。
Java 8 的 Stream API 为 Java 编程语言带来了函数式编程的强大功能,能够极大地提高集合操作的表达力和效率。