返回

面向初学者的Java流库指南(中篇):Optional与元素收集

后端

Java 8的流库带来了许多新的特性和功能,使开发人员能够以更简便、更具表现力的方式处理数据。在前一篇文章中,我们介绍了Java流库的基本概念和使用方法。在本篇文章中,我们将继续深入探讨Java流库,重点介绍Optional及其在Java流库中的使用,以及如何使用收集器来汇总和操作流中的元素。

Optional

Optional是一个包装器对象,它可以存储一个非空的值,也可以存储null值。Optional的引入是为了解决Java中处理null值的常见问题。在Java中,null是一个合法的值,但它常常会导致NullPointerException异常。Optional可以帮助我们避免NullPointerException异常,因为它允许我们在检查值是否存在之前对其进行操作。

创建Optional有三种方式:

  1. 使用Optional.of()方法创建一个包含非空值的Optional。
  2. 使用Optional.ofNullable()方法创建一个可以包含null值的Optional。
  3. 使用Optional.empty()方法创建一个空的Optional。
// 使用Optional.of()方法创建一个包含非空值的Optional
Optional<String> name = Optional.of("John Doe");

// 使用Optional.ofNullable()方法创建一个可以包含null值的Optional
Optional<String> email = Optional.ofNullable(null);

// 使用Optional.empty()方法创建一个空的Optional
Optional<String> phone = Optional.empty();

使用Optional

我们可以使用Optional来避免NullPointerException异常。以下示例演示了如何使用Optional来检查值是否存在,并在存在的情况下对其进行操作:

Optional<String> name = Optional.of("John Doe");

if (name.isPresent()) {
  String nameValue = name.get();
  System.out.println("Name: " + nameValue);
} else {
  System.out.println("Name is not present");
}

元素收集

收集器是Java流库中用于汇总和操作流中元素的工具。收集器可以将流中的元素聚合为一个单一的值、一个列表、一个集合、一个Map等。

Java流库提供了许多内置的收集器,我们可以直接使用。例如,我们可以使用Collectors.toList()收集器将流中的元素收集到一个列表中,或者使用Collectors.toMap()收集器将流中的元素收集到一个Map中。

// 使用Collectors.toList()收集器将流中的元素收集到一个列表中
List<String> names = Stream.of("John Doe", "Jane Doe", "John Smith").collect(Collectors.toList());

// 使用Collectors.toMap()收集器将流中的元素收集到一个Map中
Map<String, Integer> ages = Stream.of("John Doe", "Jane Doe", "John Smith")
  .collect(Collectors.toMap(name -> name, name -> name.length()));

自有收集器

除了使用内置的收集器之外,我们还可以创建自己的收集器。例如,我们可以创建一个收集器来计算流中元素的平均值。

public static<T> Collector<T, ?, Double> averagingDouble(Function<? super T, Double> mapper) {
  return Collectors.collectingAndThen(Collectors.averagingDouble(mapper), d -> d);
}

我们可以使用自定义收集器来计算流中元素的平均值:

// 计算流中元素的平均值
double averageAge = Stream.of(20, 30, 40).collect(averagingDouble(age -> age));

结论

本篇文章介绍了Java流库中的Optional及其使用方法,以及如何使用收集器来汇总和操作流中的元素。掌握了这些知识,您将能够更好地使用Java流库来处理数据,编写出更简洁、更具表现力的代码。