Optional的orElse和orElseGet区别

原创
2018/05/10 16:16
阅读数 4.7W

先试下返回的Optional类有值的情况:

public static void main(String[] args) {
        List<Integer> list =  Arrays.asList(10,20,30);
        //通过reduce方法得到一个Optional类
        int a =  list.stream().reduce(Integer::sum).orElse(get("a"));
        int b =  list.stream().reduce(Integer::sum).orElseGet(() -> get("b"));
        System.out.println("a  "+a);
        System.out.println("b  "+b);
    }
    public static int get(String name){
        System.out.println(name+"执行了方法");
        return 1;
    }
   

打印结果:

  a执行了方法

  a的值:60

  b的值:60

再试下返回的Optional类是空值的情况:

public static void main(String[] args) {
        List<Integer> list =  Arrays.asList();
        //通过reduce方法得到一个Optional类
        int a =  list.stream().reduce(Integer::sum).orElse(get("a"));
        int b =  list.stream().reduce(Integer::sum).orElseGet(() -> get("b"));
        System.out.println("a  "+a);
        System.out.println("b  "+b);
    }
    public static int get(String name){
        System.out.println(name+"执行了方法");
        return 1;
    }
   

打印结果:

a执行了方法

b执行了方法

a的值:1

b的值:1

可以发现,当Optonal的值是空值时,无论orElse还是orElseGet都会执行;而当返回的Optional有值时,orElse会执行,而orElseGet不会执行。

展开阅读全文
打赏
0
0 收藏
分享
加载中
其实博主想表达的意思没错,只是没说清楚。而你的则是完全错了。
正确的理解:
1、因为orElse(T other)中只能传入了一个引用(只能是普通的指针,不能是函数指针。Java中的函数式接口说起来费劲,这里借用C中的说法),所以,如果该对象为通过函数调用得到的返回值,则该函数必被调用(其实是屁话,不被调用,怎么得到返回值?)。
2、因为orElseGet(Supplier<? extends T> other)中只能传入一个Supplier类型的函数指针,而函数指针指向的函数是不会自动执行的,如要执行,则必须手动调用。而显然orElseGet(Supplier)的源码里应该是做了判断,如果调用orElseGet方法的Optional对象中的值非空,则不执行函数指针指向的函数体内的代码;如果Optioanal对象中的值为空,则执行函数指针指向的函数体内的代码。
我看了下Optional的源码,确实和我说的是一致的。下面是源码:
public T orElseGet(Supplier<? extends T> other)
{
return value != null ? value : other.get();
}
2019/08/12 13:44
回复
举报
纠正一下博主的结论。应该是:无论Optional有值还是为空,orElse、orElseGet都会执行,只是为空值时,orElseGet中传入的方法实现不会执行。
2019/04/28 11:11
回复
举报
更多评论
打赏
2 评论
0 收藏
0
分享
返回顶部
顶部