orElse和orElseGet

2019-03-05  本文已影响18人  竹鼠不要中暑

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

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

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

T orElse(T other)

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

T orElseGet(Supplier<? extends T> other)

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

区别

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

看下面一个例子:

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

上一篇 下一篇

猜你喜欢

热点阅读