8 Java 8新特性之Stream API

在上一篇文章中,我们讨论了Java 8的新特性之一——Lambda表达式,它极大地简化了代码中的匿名内部类的使用。今天,我们将深入探讨另一个重要特性——Stream APIStream API提供了一种高效且清晰的方式来处理集合数据,支持多种操作,例如过滤、映射、和归约等。它使得我们能够用声明式的方式处理数据,极大提高了代码的可读性和简洁性。

1. 什么是Stream?

在Java中,Stream是一种对集合的操作抽象,它不存储数据,而是计算数据。Stream可以被认为是集合的一种“管道”,允许我们在数据上进行一系列的计算。与集合不同的是,Stream的操作可以是惰性求值的,也就是说,数据计算会在需要时才执行,从而有助于提高性能。

2. Stream的创建

我们可以通过几种方式创建Stream:

2.1 从集合创建Stream

最常见的方法是从集合中创建Stream,例如:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.Stream;

public class StreamExample {
public static void main(String[] args) {
List<String> names = new ArrayList<>();
names.add("Alice");
names.add("Bob");
names.add("Charlie");

Stream<String> stream = names.stream();
List<String> upperCaseNames = stream.map(String::toUpperCase).collect(Collectors.toList());

System.out.println(upperCaseNames);
}
}

在这个例子中,我们首先创建了一个List,然后使用stream()方法将其转换为一个Stream。接着,我们通过map方法将每个名字转换为大写,最后使用collect方法将结果收集到一个新的列表中。

2.2 从数组创建Stream

除了集合,我们还可以从数组创建Stream:

1
2
String[] array = {"A", "B", "C"};
Stream<String> streamFromArray = Stream.of(array);

2.3 使用Stream.generate()和Stream.iterate()

Java 8还提供了Stream.generate()Stream.iterate()来生成无限流:

1
2
Stream<Double> randomNumbers = Stream.generate(Math::random).limit(5);
randomNumbers.forEach(System.out::println);

3. Stream的操作

Stream支持多种操作,主要分为两类:中间操作终端操作

3.1 中间操作

中间操作是惰性执行的,意味着它们不会立即计算,而是在需要时才执行。常见的中间操作有:

  • filter(predicate):用于过滤元素。
  • map(function):用于转换元素。
  • distinct():去重。
  • sorted():排序。

例如,使用filter来选择特定的元素:

1
2
3
4
List<String> filteredNames = names.stream()
.filter(name -> name.startsWith("A"))
.collect(Collectors.toList());
System.out.println(filteredNames); // 输出: [Alice]

3.2 终端操作

终端操作会触发流的计算并产生结果,常见的终端操作有:

  • collect():将元素收集到集合中。
  • count():计算元素个数。
  • forEach(consumer):对每个元素执行操作。
  • reduce():将元素归约成一个值。

例如,使用count来计算元素个数:

1
2
long count = names.stream().count();
System.out.println(count); // 输出: 3

3.3 归约操作

reduce是一种实现归约的方法,它允许我们将流中的元素合并成一个单独的值。例如:

1
2
int sum = Stream.of(1, 2, 3, 4, 5).reduce(0, Integer::sum);
System.out.println(sum); // 输出: 15

在这个示例中,我们使用reduce将1到5的值相加,初始值为0。

4. Stream的优势

  • 声明式操作:Stream允许以声明的方式进行操作,而不是命令式的、逐步控制的方式。
  • 惰性求值:Stream的中间操作是惰性求值的,提升了性能。
  • 并行处理:Stream API简化了并行处理的实现,可以通过parallelStream()轻松实现并行流处理。
1
2
3
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
int sum = numbers.parallelStream().reduce(0, Integer::sum);
System.out.println(sum); // 输出: 15

5. 小结

在这一篇中,我们深入探讨了Java 8中的Stream API。通过各种示例,我们展示了如何创建Stream、进行基本操作及其优点。Stream API结合了Lambda表达式的优雅,使得数据处理更加高效和易读。在下一篇文章中,我们将讨论Java 8中的Optional类,这是处理可能为空的值的一种更安全且更优雅的方法。通过对这些特性的理解和应用,相信你将能更好地提升你的Java编程能力。

8 Java 8新特性之Stream API

https://zglg.work/java-one/8/

作者

IT教程网(郭震)

发布于

2024-08-10

更新于

2024-08-10

许可协议

分享转发

复习上节

交流

更多教程加公众号

更多教程加公众号

加入星球获取PDF

加入星球获取PDF

打卡评论