引言
Java 8引入了Stream API,这是对Java集合操作的一次重大革新。Stream API提供了一种高效且易于使用的方式来处理数据集合,特别是通过支持函数式编程风格,使得代码更加简洁和可读。
Stream API简介
什么是Stream?
Stream是Java 8中引入的一个新抽象,它允许你以声明式的方式处理数据集合。Stream可以看作是对集合的高级迭代器,但它不仅仅是一个迭代器,它还提供了丰富的操作,如过滤、映射、排序、聚合等。
Stream的特点
-
惰性求值:Stream的操作是惰性的,只有在终端操作执行时才会真正开始处理数据。
-
不可变性:Stream不会修改源数据,所有的操作都会生成一个新的Stream。
-
并行处理:Stream API天然支持并行处理,可以轻松地将顺序流转换为并行流。
Stream API的基本操作
创建Stream
Stream可以通过多种方式创建,常见的包括:
-
从集合创建:List.stream()
-
从数组创建:Arrays.stream(array)
-
使用Stream的静态方法:Stream.of()
java">List<String> list = Arrays.asList("a", "b", "c");
Stream<String> stream = list.stream();
中间操作
中间操作是对Stream进行处理的步骤,常见的中间操作包括:
-
filter(Predicate):过滤元素
-
map(Function):将元素映射为另一种形式
-
sorted():排序元素
-
distinct():去重
java">List<String> result = list.stream().filter(s -> s.startsWith("a")).map(String::toUpperCase).collect(Collectors.toList());
终端操作
终端操作是Stream的最终处理步骤,常见的终端操作包括:
-
forEach(Consumer):对每个元素执行操作
-
collect(Collector):将Stream转换为集合
-
reduce(BinaryOperator):将Stream中的元素归约为一个值
-
count():计算Stream中的元素数量
java">long count = list.stream().filter(s -> s.startsWith("a")).count();
Stream API的高级用法
并行流
通过parallelStream()方法,可以轻松地将顺序流转换为并行流,从而利用多核处理器的优势。
java">List<String> result = list.parallelStream().filter(s -> s.startsWith("a")).collect(Collectors.toList());
自定义收集器
Java 8提供了Collectors类来支持常见的收集操作,但你也可以自定义收集器来实现更复杂的数据处理。
java">Collector<String, ?, TreeSet<String>> intoSet = Collector.of(TreeSet::new, TreeSet::add, (left, right) -> { left.addAll(right); return left; });TreeSet<String> set = list.stream().collect(intoSet);
流的拼接与拆分
Stream API还支持流的拼接与拆分操作,如flatMap()可以将多个流合并为一个流,limit()和skip()可以用于流的拆分。
java">List<List<String>> lists = Arrays.asList(Arrays.asList("a", "b"),Arrays.asList("c", "d")
);List<String> flatList = lists.stream().flatMap(List::stream).collect(Collectors.toList());
Stream API的实战应用
数据处理与转换
Stream API非常适合用于数据处理与转换场景,如从数据库中读取数据并进行过滤、映射等操作。
java">List<User> users = userRepository.findAll();
List<String> names = users.stream().filter(user -> user.getAge() > 18).map(User::getName).collect(Collectors.toList());
数据统计与聚合
Stream API可以方便地进行数据统计与聚合操作,如计算平均值、最大值、最小值等。
java">Double averageAge = users.stream().mapToInt(User::getAge).average().orElse(0);
并行处理大数据集
对于大数据集,使用并行流可以显著提高处理速度。例如,处理一个包含百万条记录的数据集时,并行流可以充分利用多核CPU的优势。
java">List<User> users = userRepository.findAll();
List<String> names = users.parallelStream().filter(user -> user.getAge() > 18).map(User::getName).collect(Collectors.toList());