orElse()和orElseGet()的详细区别

2019-03-10  本文已影响0人  加一片柠檬233

orElse()方法的描述是“返回值,如果存在,否则返回其他。
orElseGet()方法的描述是“返回值如果存在,否则调用其他值并返回该调用的结果。

public T orElse(T other)
public T orElseGet(Supplier<? extends T> other)

有上可知,orElse() 接受类型T的 任何参数,而orElseGet()接受类型为Supplier的函数接口,该接口返回类型为T的对象 。

当Optional的值是空值时,无论orElse还是orElseGet都会执行;而当返回的Optional有值时,orElse会执行,而orElseGet不会执行。默认情况下,每次使用orElseGet() 更有意义,除非默认对象已经构造并且可以直接访问。

  1. 返回的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
  1. 返回的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
上一篇下一篇

猜你喜欢

热点阅读