首页 > 文章列表 > Java 8中的Optional类:如何使用orElseGet()方法实现延迟求值

Java 8中的Optional类:如何使用orElseGet()方法实现延迟求值

java Optional orElseGet()
284 2023-08-04

Java 8中的Optional类:如何使用orElseGet()方法实现延迟求值

引言:

Java 8引入了Optional类,它是一个容器对象,可以包含一个非空值或者空值。Option类的目的是处理空值,以减少NullPointerException的发生概率,同时也提高了代码的可读性。在Optional类中,有一个非常有用的方法orElseGet(),它可以实现延迟求值的功能。本文将介绍Optional类以及如何使用orElseGet()方法来实现延迟求值。

Optional类的概述:

Optional类是一个泛型类,它的定义如下:

public final class Optional<T> {

    /**
     * Returns an Optional instance with the specified present non-null value.
     *
     * @param value the value to be present, which must be non-null
     * @param <T>   the class of the value
     * @return an Optional with the value present
     * @throws NullPointerException if value is null
     */
    public static <T> Optional<T> of(T value) {
        return new Optional<>(Objects.requireNonNull(value));
    }

    /**
     * Returns an Optional describing the specified value, if non-null,
     * otherwise returns an empty Optional.
     *
     * @param value the possibly-null value to describe
     * @param <T>   the class of the value
     * @return an Optional with a present value if the specified value
     * is non-null, otherwise an empty Optional
     */
    public static <T> Optional<T> ofNullable(T value) {
        return value == null ? empty() : of(value);
    }

    /**
     * Returns an empty Optional instance.  No value is present for this
     * Optional.
     *
     * @param <T> the class of the value
     * @return an empty Optional
     */
    public static <T> Optional<T> empty() {
        @SuppressWarnings("unchecked")
        Optional<T> t = (Optional<T>) EMPTY;
        return t;
    }

    // More methods...
}

如上所示,Optional类提供了of()、ofNullable()和empty()等静态方法用于创建Optional实例。of()方法用于创建一个包含非空值的Optional实例,如果传入的value为null,则抛出NullPointerException。ofNullable()方法用于创建一个Optional实例,它可以接受一个null值。empty()方法用于创建一个空的Optional实例。

使用orElseGet()实现延迟求值:

在我们调用Optional对象的orElseGet()方法之前,我们无法确定该Optional对象是否包含非空值,因此orElseGet()方法在结果为空时提供了一个回退的选项。其定义如下:

public T orElseGet(Supplier<? extends T> other) {
        return value != null ? value : other.get();
    }

上述方法接受一个实现了Supplier接口的lambda表达式作为参数,当Optional实例中的值为空时,orElseGet()方法将调用该lambda表达式的get()方法,以提供一个替代值。

下面是一个使用orElseGet()方法实现延迟求值的示例代码:

public class Main {
    public static void main(String[] args) {
        Optional<Integer> optional = Optional.empty();
        Integer value = optional.orElseGet(Main::calculate);
        System.out.println("Value = " + value);
    }

    public static Integer calculate() {
        System.out.println("Calculating...");
        return 10;
    }
}

在上述示例代码中,我们首先创建了一个空的Optional实例。接下来,我们调用orElseGet()方法,将calculate()方法作为参数传入。当Optional对象为空时,orElseGet()方法将调用calculate()方法来计算一个新的值。最后,我们打印出计算得到的值。

运行上述示例代码,可以发现输出结果为:“Calculating...”和“Value = 10”。这表明当Optional对象为空时,calculate()方法被调用,计算得到了一个新的值。

总结:

本文介绍了Java 8中的Optional类以及如何使用orElseGet()方法实现延迟求值。Optional类为我们处理可能为空的值提供了很方便的方式,可以减少NullPointerException的发生概率,同时也提高了代码的可读性。通过使用orElseGet()方法,我们可以实现延迟求值,以提供一个替代值。希望本文可以帮助读者更好地理解Optional类的使用,以及如何使用orElseGet()方法来实现延迟求值。