Optional的orElse和orElseGet區別

先試下返回的Optional類有值的狀況:code

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;
    }

打印結果:get

a執行了方法

  a的值:60

  b的值:60

再試下返回的Optional類是空值的狀況:io

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;
    }

打印結果:stream

a執行了方法

b執行了方法

a的值:1

b的值:1

能夠發現,當Optonal的值是空值時,不管orElse仍是orElseGet都會執行;而當返回的Optional有值時,orElse會執行,而orElseGet不會執行。

相關文章
相關標籤/搜索