【Java 基础】31 Optional

2023-12-13 05:11:34


在 Java 编程中,我们经常会处理可能为空的值。为了更好地应对这种情况,Java 8 引入了 Optional 类,它提供了一种优雅的方式来处理可能为 null 的值。

1.定义

Optional 是 Java 8 中引入的一个容器类,用于表示一个值可能存在或可能不存在。它是对可能为 null 的值的一种封装,通过 Optional,我们可以更加优雅地处理空值的情况,避免了繁琐的空值检查。

2.创建

我们可以使用多种方式来创建 Optional 对象

1)创建包含非空值的 Optional

Optional<String> nonEmptyOptional = Optional.of("Hello, Optional");

2)创建可能为 null 的 Optional

String nullableValue = getNullableValue();
Optional<String> optionalNullable = Optional.ofNullable(nullableValue);

3)创建空的 Optional

Optional<String> emptyOptional = Optional.empty();

3.用法

1)判断值是否存在

使用 isPresent() 方法判断 Optional 中是否包含非空值

Optional<String> optional = Optional.of("Hello");
if (optional.isPresent()) {
    System.out.println("值存在: " + optional.get());
} else {
    System.out.println("值不存在");
}

2)获取值或默认值

使用 orElse() 方法获取 Optional 中的值,如果值不存在,则返回默认值

String value = optional.orElse("Default Value");
System.out.println("Value: " + value);

3)使用 Lambda 表达式处理值

通过 ifPresent() 方法,可以使用 Lambda 表达式处理 Optional 中的值

optional.ifPresent(val -> System.out.println("Value: " + val));

4)使用过滤器

filter() 方法可以对 Optional 中的值进行过滤,只有满足条件的值才会保留

Optional<String> filteredOptional = optional.filter(val -> val.length() > 6);
filteredOptional.ifPresent(val -> System.out.println("Filtered Value: " + val));

5)转换值

通过 map() 方法,我们可以对 Optional 中的值进行转换

Optional<Integer> lengthOptional = optional.map(String::length);
lengthOptional.ifPresent(length -> System.out.println("Length: " + length));

4.优势

1)明确空值处理

Optional 使得空值处理更加明确和优雅。在方法的返回类型中使用 Optional 可以清晰地表达方法可能返回空值,提醒调用方进行相应的处理。

public Optional<String> findUserById(String userId) {
    // xxxxx
}

2)避免空指针异常

使用 Optional 能够有效地避免空指针异常。通过链式调用和合理的处理,我们可以更安全地访问可能为空的值。

String result = userService.findUserById("1001")
                           .map(User::getName)
                           .orElse("Default Name");

3)引导式编程

Optional 支持一种引导式编程风格,通过链式调用,代码更加流畅,减少了空值检查的繁琐程度。

String userName = userService.findUserById("1001")
                            .flatMap(User::getAddress)
                            .map(Address::getCity)
                            .orElse("Unknown City");

5.注意事项

  • 不要在集合类中使用 Optional

    Optional 不应该用作集合类的元素,因为它会引入额外的包装和操作开销。对于集合,应该直接使用 null 表示空值。

  • 谨慎使用 get()

    在使用 Optional 时,应该尽量避免使用 get() 方法获取值,除非确定值一定存在。否则,应该使用 orElse 等方法提供默认值或者进行其他处理。

6.适用场景

Optional 最适合用于方法的返回值、字段等可能为 null 的情况。在这些场景下,使用 Optional 能够提高代码的可读性和安全性。

总结

Optional 是 Java 8 引入的一个强大工具,用于更好地处理可能为空的值。通过 Optional,我们可以清晰地表示值的存在与否,避免了繁琐的空值检查和空指针异常。

文章来源:https://blog.csdn.net/yanyc0411/article/details/134959461
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。