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}
JDK8中`Optional.orElse()` 和`Optional.orElseGet()`之间的区别(重写)_第1张图片

对于orElseGet:返回值(如果存在),否则调用{other}并返回该调用的结果。
JDK8中`Optional.orElse()` 和`Optional.orElseGet()`之间的区别(重写)_第2张图片

总结

  • 传入Optonal值为非空,orElse或orElseGet都会执行,返回传入值;
  • 传入Optional值为空,orElse会返回null,orElseGet会执行,并且返回执行方法体的结果;
  • 由于orElseGet使用的是Supplier,返回other.get(),传入null会报空指针

简单场景:从远程Web服务或数据库中获取默认值,针对null的情况进行日志记录,并且返回一个方法体的结果,这个时候只能用orElseGet()。

你可能感兴趣的:(java)