美文网首页
orElse和orElseGet

orElse和orElseGet

作者: 竹鼠不要中暑 | 来源:发表于2019-03-05 15:31 被阅读18次

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方法。

相关文章

网友评论

      本文标题:orElse和orElseGet

      本文链接:https://www.haomeiwen.com/subject/uvxouqtx.html