JDK8中`Optional.orElse()` 和`Optional.orElseGet()`之间的区别(重写)
前言
上次写的JDK8中Optional.orElse() 和Optional.orElseGet()之间的区别比较模糊,重读了一遍源码写个再例子
Example
import java.util.Optional;
/**
* 传入Optonal值为非空,orElse或orElseGet都会执行,返回传入值;
* 传入Optional值为空,orElse会执行,orElseGet不会执行,返回执行方法体的结果.
* @author terry
* @since 29/05/2019
*/
public class OptionalTest {
/**
-----------non-null----------
invokeType:orElse
input:100 output:100
input:100 output:100
-----------null--------------
invokeType:orElse
input:null output:9527
invokeType:orElseGet
input:null output:9527
*/
public static void main(String[] args){
Integer Yes=100;
Integer No=null;
System.out.println("-----------non-null----------");
System.out.println("input:"+Yes+"\toutput:"+Optional.ofNullable(Yes).orElse(invokeMethod("orElse")));
System.out.println("input:"+Yes+"\toutput:"+Optional.ofNullable(Yes).orElseGet(() ->invokeMethod("orElseGet")));
System.out.println("-----------null--------------");
System.out.println("input:"+No+"\toutput:"+Optional.ofNullable(No).orElse(invokeMethod("orElse")));
System.out.println("input:"+No+"\toutput:"+Optional.ofNullable(No).orElseGet(() ->invokeMethod("orElseGet")));
}
/**
* invokeMethod
* @param type
* @return
*/
public static Integer invokeMethod(String type){
System.out.println("invokeType:"+type);
return 9527;
}
}
源码
对于orElse
:返回值(如果存在),否则返回{other}
对于orElseGet
:返回值(如果存在),否则调用{other}并返回该调用的结果。
总结
- 传入Optonal值为非空,orElse或orElseGet都会执行,返回传入值;
- 传入Optional值为空,orElse会执行,orElseGet不会执行,返回执行方法体的结果;
- 由于orElseGet使用的是Supplier,返回
other.get()
,传入null会报空指针
简单场景:从远程Web服务或数据库中获取默认值,针对null的情况进行日志记录,并且返回一个方法体的结果,这个时候只能用orElseGet()。