Java8新特性 - Optional

一、特性

  1. 创建Optional对象:
// 创建了包含非null值的 Optional 对象
Optional<String> optionalString = Optional.of("Hello, Optional!");
// 创建一个不包含任何值的空 Optional 对象
Optional<String> emptyOptional = Optional.empty();
// 创建一个包含指定值的 Optional 对象,如果指定的值为 null,则创建一个空的 Optional 对象:
Optional<String> nullableOptional = Optional.ofNullable(T value);
  1. 判断是否有值:
if (optionalString.isPresent()) {
    System.out.println("Value is present: " + optionalString.get());
} else {
    System.out.println("Value is absent.");
}
  1. 如果有值则执行操作,否则执行默认操作:
String result = optionalString.orElse("Default Value");
System.out.println("Result: " + result);
  1. 如果有值则执行操作:
optionalString.ifPresent(value -> System.out.println("Value is present: " + value));
  1. 获取值,或者如果没有值则抛出异常:
String value = optionalString.orElseThrow(() -> new IllegalStateException("Value is absent"));
System.out.println("Value: " + value);
  1. 如果有值满足条件则执行操作:
optionalString.filter(s -> s.contains("Optional"))
    .ifPresent(filteredValue -> System.out.println("Filtered Value: " + filteredValue));
  1. 对值进行转换:
Optional<Integer> lengthOptional = optionalString.map(String::length);
lengthOptional.ifPresent(length -> System.out.println("Length: " + length));
  1. 如果有值,则应用函数并返回新的Optional:
Optional<String> upperCaseOptional = optionalString.map(String::toUpperCase);
upperCaseOptional.ifPresent(upperCaseValue -> System.out.println("Upper Case Value: " + upperCaseValue));
  1. 如果有值,则应用函数返回新的Optional,然后将结果展平(flat map):
Optional<String> flatMappedOptional = optionalString.flatMap(value -> Optional.of(value + " - FlatMapped"));
flatMappedOptional.ifPresent(flatMappedValue -> System.out.println("Flat Mapped Value: " + flatMappedValue));

二、解决问题

Optional 是为了解决空指针异常(NullPointerException)问题而引入的。在Java中,当我们尝试访问一个对象的属性或调用其方法时,如果该对象为 null,就会抛出空指针异常。Optional 旨在提供一种更安全、更清晰的方式来处理可能为 null 的值,从而减少空指针异常的发生。

以下是 Optional 的一些优点和解决的问题:

  1. 避免空指针异常:
    Optional 提供了一种方式来明确表示一个值可能为空,而不是使用 null,从而减少了因为空指针异常而引起的程序崩溃的可能性。

  2. 更清晰的代码:
    使用 Optional 可以使代码更清晰和表达意图,因为它强调了一个值可能为空的情况,并迫使程序员在代码中显式处理这种情况。

  3. 链式调用:
    Optional 提供了一组方法,允许进行链式调用,使得代码更加流畅和易读。

以下是一个简单的案例,说明 Optional 如何帮助解决空指针异常问题:

import java.util.Optional;

public class OptionalExample {
    public static void main(String[] args) {
        // 使用传统方式可能引发空指针异常
        String result = getUserNameLengthLegacy(null);
        System.out.println("Legacy result: " + result);

        // 使用Optional避免空指针异常
        Optional<String> optionalUserName = Optional.ofNullable(null);
        String resultOptional = optionalUserName.map(String::length).orElse(-1).toString();
        System.out.println("Optional result: " + resultOptional);
    }

    // 传统方式可能引发空指针异常
    private static String getUserNameLengthLegacy(String userName) {
        return userName.length() + ""; // 可能引发空指针异常
    }
}

在上述示例中,getUserNameLengthLegacy 方法接受一个用户名,并尝试获取其长度。如果传入 null,将抛出空指针异常。相比之下,使用 Optional 的方式能够更加安全地处理可能为 null 的情况,避免了潜在的空指针异常。

你可能感兴趣的:(Java8新特性,java)