深入探究 Java 8 新特性:Optional 类允许为空的对象类

深入探究 Java 8 新特性:Optional 类

概念说明

​ 在 Java 8 中,引入了许多令人兴奋的新特性,其中之一就是 Optional 类。这个类主要用于解决空指针异常(NullPointerException)的问题,提供了一种更安全和优雅的方式来处理可能为 null 的值。


为什么需要 Optional 类?

​ 在传统的 Java 编程中,我们经常需要检查一个对象是否为 null,以避免出现空指针异常。这导致了代码的冗余和可读性的降低。Java 8 引入的 Optional 类可以让我们更加优雅地处理可能为 null 的情况,从而减少代码中的条件检查。

类声明

以下是一个 java.util.Optional 类的声明:

public final class Optional<T> extends Object

Optional 类的基本用法

Optional 类是一个容器对象,它可以包含一个非空的值,也可以表示一个为空的值。我们可以使用 Optional.of() 方法创建一个包含非空值的 Optional 对象,或者使用 Optional.empty() 方法创建一个空的 Optional 对象。

下面是一个简单的示例:

Optional<String> optionalValue = Optional.of("Hello, Optional!");//非空值对象
Optional<String> emptyOptional = Optional.empty();//空值对象

如何避免空指针异常?

​ 通过使用 Optional 类,我们可以采用一种更加优雅的方式来避免空指针异常。下面是一个示例:

String name = null;
Optional<String> optionalName = Optional.ofNullable(name);//声明这个对象可能为空
String actualName = optionalName.orElse("Unknown");//指定了对象为空时的默认值
System.out.println("Name: " + actualName);

​ 在上面的示例中,我们使用了 Optional.ofNullable() 方法来创建一个可能为空的 Optional 对象。然后,通过 orElse() 方法,我们指定了在对象为空时的默认值。


如何从 Optional 中获取值?

我们可以使用不同的方法从 Optional 对象中获取值,例如:

  • get():获取值,如果值为空则会抛出异常。
  • orElse(T other):获取值,如果值为空则返回指定的默认值。
  • orElseGet(Supplier other):获取值,如果值为空则通过 Supplier 返回默认值。
  • orElseThrow(Supplier exceptionSupplier):获取值,如果值为空则抛出指定的异常。

Optional 类的链式操作

Optional 类支持链式操作,这使得我们可以在一系列的操作中处理可能为空的值。例如:

String result = Optional.ofNullable("Hello")
                       .map(s -> s + ", Optional!")
                       .orElse("Default Value");
System.out.println(result);

通过链式操作来处理数据,从而降低代码的复杂度,提高代码的可读性和可维护性。


java 中泛型标记符:

E - Element (在集合中使用,因为集合中存放的是元素)
T - Type(Java 类)
K - Key(键)
V - Value(值)
N - Number(数值类型)
? - 表示不确定的 java 类型


Optional类的方法

序号 方法 & 描述
1 static Optional empty()返回空的 Optional 实例。
2 boolean equals(Object obj)判断其他对象是否等于 Optional。
3 Optional filter(Predicate
4 Optional flatMap(Function> mapper)如果值存在,返回基于Optional包含的映射方法的值,否则返回一个空的Optional
5* T get()如果在这个Optional中包含这个值,返回值,否则抛出异常:NoSuchElementException
6 int hashCode()返回存在值的哈希码,如果值不存在 返回 0。
7 void ifPresent(Consumer consumer)如果值存在则使用该值调用 consumer , 否则不做任何事情。
8* boolean isPresent()如果值存在则方法会返回true,否则返回 false。
9 Optional map(Function mapper)如果有值,则对其执行调用映射函数得到返回值。如果返回值不为 null,则创建包含映射返回值的Optional作为map方法返回值,否则返回空Optional。
10* static Optional of(T value)返回一个指定非null值的Optional。
11* static Optional ofNullable(T value)如果为非空,返回 Optional 描述的指定值,否则返回空的 Optional。
12* T orElse(T other)如果存在该值,返回值, 否则返回 other。
13 T orElseGet(Supplier other)如果存在该值,返回值, 否则触发 other,并返回 other 调用的结果。
14 T orElseThrow(Supplier exceptionSupplier)如果存在该值,返回包含的值,否则抛出由 Supplier 继承的异常
15 String toString()返回一个Optional的非空字符串,用来调试

注意: 这些方法是从 java.lang.Object 类继承来的。


下面是具体的实例,这个实例来自于菜鸟教程:

public class OptionalDemo {
    public static void main(String[] args) {
        Integer value1=null;
        Integer value2=new Integer(10);


        // Optional.of - 如果传递的参数是 null,抛出异常 NullPointerException
        Optional<Integer> a = Optional.ofNullable(value1);
        Optional<Integer> b = Optional.of(value2);
        System.out.println(sum(a,b));

    }
    public static Integer sum(Optional<Integer> a,Optional<Integer> b){

        // Optional.isPresent - 判断值是否存在
        System.out.println("第一个参数是否存在"+a.isPresent());
        System.out.println("第二个参数是否存在"+b.isPresent());

        // Optional.orElse - 如果值存在,返回它,否则返回默认值
        Integer value1=a.orElse(new Integer(0));

        //Optional.get - 获取值,值需要存在
        Integer value2=b.get();

        System.out.println(value1);

        return value1+value2;
    }

}

输出结果如下:

深入探究 Java 8 新特性:Optional 类允许为空的对象类_第1张图片


总结

Java 8 引入的 Optional 类为我们提供了一种更加安全和优雅的方式来处理可能为空的值,避免了空指针异常的发生。通过使用 Optional 类,我们可以编写出更加简洁、可读性更高的代码。

作者:Stevedash

发表于:2023年8月18日 19点45分

来源:Java 8 Optional 类 | 菜鸟教程 (runoob.com)

注:本文内容基于个人学习理解,如有错误或疏漏,欢迎指正。感谢阅读!如果觉得有帮助,请点赞和分享。

你可能感兴趣的:(Java高级编程学习-菜鸟教程,java,开发语言)