两者之间的区别细微, 但是却在某些场景下显的很重要.
首先, 这是两个在java.util.Optional类中的方法:源码非常简单,
package java.util;
public final class Optional<T> {
...
public T orElse(T other) {
return this.value != null ? this.value : other;
}
public T orElseGet(Supplier<? extends T> supplier) {
return this.value != null ? this.value : supplier.get();
}
}
Optional
相当于一个容器,可以一个接收的对象value
,用泛型指定类型,并且该对象有可能为空.Supplier
是一个函数式接口,只定义了一个返回值为T
类型的get()
方法,用于产生(提供)对象,可以使用lambda表达式定义实现orElse(T other)
不论容器是否为空,只要调用该方法, 则对象other
一定存在orElseGet(Supplier<? extends T> supplier)
只有当容器为空时,才调用supplier.get()
方法产生对象
请想象以下场景:
在分布式开发中,有一个方法需要接收前台数据,但该数据可能为空,
当该数据为空时,需要远程调用一个方法为其设置默认值
public String getDefaultValue(){ //远程方法调用
System.out.println("我被调用了!");
return "我是默认值";
}
@Test
public void testSupplier(){
Optional<String> opt = Optional.of("前端数据");
String x = opt.orElse( getDefaultValue() );
System.out.println("---以上为orElse调用,以下为orElseGet调用---");
String y = opt.orElseGet( ()->getDefaultValue() );
}
运行结果
我被调用了!
---以上为orElse调用,以下为orElseGet调用---
结果为orElse
调用方法,orElseGet
没有调用方法
- 可以看到,虽然
opt
不为空,但是orElse()
依然调用了远程方法,并产生了一个String对象 orElseGet
并没有调用方法,也没有产生任何对象
所以可见orElseGet()
更优, 但代价就是需要传入一个Supplier<T>
类型的参数,相对会麻烦一些.
如有错误疏漏之处,还请指正,感谢。