orElse和orElseGet

orElseorElseGet作为Optional类的两个常用方法,都表示当Optional对象里面的值为空的时候,返回一个默认的值

按照常理,既然将它们写为两个不同的方法,其中就一定有些差别。

首先我们看一下这两个方法的具体描述:

  • orElse
T orElse(T other)

如果存在该值,返回值, 否则返回 other

  • orElseGet
T orElseGet(Supplier<? extends T> other)

如果存在该值,返回值, 否则触发 other,并返回 other 调用的结果。

区别

可以注意到,二者的描述主要有两点不同:

  • orElse方法的传入参数为为一个某类型(泛型)的值,而orElseGet方法接受的传入方法为一个Supplier。Supplier我们在函数式接口一节学习过,它是一个没有输入参数的函数式接口。
  • orElseGet方法的描述里我加粗了触发二字,注意到它是在optional的值为空时才触发。

看下面一个例子:

import java.util.Optional;

public class OptionalTest {
    public static void main(String[] args) {
        Integer value1 = null;
        Integer value2 = 10;
        Optional<Integer> a = Optional.ofNullable(value1);
        Optional<Integer> b = Optional.of(value2);
        System.out.println(b.orElse(getDefaultValue())); // 调用getDefaultValue
        System.out.println(a.orElse(getDefaultValue())); // 调用getDefaultValue
        System.out.println(b.orElseGet(() -> getDefaultValue())); // 不调用getDefaultValue
        System.out.println(a.orElseGet(() -> getDefaultValue())); // 调用getDefaultValue
    }

    public static Integer getDefaultValue() {
        return new Integer(0);
    }
}

对于上面这个例子,首先,我们可以看出orElseorElseGet的传入参数不同。

其次,对于orElse方法,无论Optional的值是否为空,它都会去获得传入的值,在上例中也就是说,始终会调用getDefaultValue;而orElseGet方法则只有在Optional的值为空时才去触发传入的Supplier,我们上例的getDefaultValue也在此时才会被调用。从这一点不同,我们可以感觉到,orElseGet方法要优于orElse方法。

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容