Java8 Lambda表示式、Optional類淺析

Kevin.ZhangCG發表於2021-06-17

1.概念

Lambda是一個匿名函式,可以將其理解為一段可以傳遞的程式碼(將程式碼像資料一樣進行傳遞)可以寫出更簡潔、更靈活的程式碼。作為一種更緊湊的程式碼風格,使得java語言的表達能利得到了提升。

2. Lambda表示式的基礎語法

java8中引用了一個新的操作符"->",該操作符稱為箭頭操作符或者Lambda操作符,箭頭操作符將Lambda表示式分為了兩部分:

  • 左邊:Lambda表示式的引數列表

  • 右邊:Lambda表示式中,所需要執行的功能,即 Lambda體

語法格式一:無引數,無返回值的方法
() -> Lambda
如: () -> System.out.println("hello");

語法格式二:有一個引數,並且無返回值
(引數1) -> Lambda
如: (x) -> System.out.println("hehe");

語法格式三:若只有一個引數小括號可以省略不寫
引數1-> Lambda
如: -> System.out.println("hehe");

語法格式四:有兩個以上的引數,有返回值,並且Lambda體中有多條語句
(引數1,引數2) -> {語句體1;語句體2};
如:

            Comparator com -> (x,y) -> {
                System.out.println("函式式介面");
                return Integer.compare(x,y);
            }

語法格式五:若Lambda體中只有一條語句,return和大括號都可以不寫
(引數1,引數2) -> 語句體1;
如:
Comparator com = (x,y) -> Integer.compare(x,y);

語法格式六:Lambda表示式的引數列表的資料型別可以省略不寫,因為JVM編譯器通過上下文推斷出資料型別即“型別推斷”
如: (Integer x, Integer y) -> Integer.compare(x,y);

3. Lambda表示式需要“函式式介面”的支援

函式式介面:介面中只有一個抽象方法的藉口,稱為函式式介面,可以使用註解** @FunctionInterface **修飾,可以檢查是否是函式式介面

4. java8中內建的四大核心函式式介面

Consumer<T> : 消費型介面
void accept(T t);

 

Supplier<T> : 供給型介面
 T get();

 

Function<T, R> : 函式型介面
 R apply(T t);

 

Predicate<T> : 斷言型介面
boolean test(T t);

5. 方法引用

概念:若Lambda 體中的內容有方法已經實現了,我們可以使用“方法引用”(可以理解為“方法引用”是Lambda表示式的另外一種表現形式)

主要有三種語法格式:
  • 物件::例項方法名
  • 類::靜態方法名
  • 類::例項方法名

注意:

  • Lambda體中呼叫方法的引數列表與返回值型別,要與函式式介面中抽象方法的函式列表和返回值保持一致;
  • 若 Lambda 引數列表中的第一個引數是例項方法的呼叫者,而第二個引數是例項方法的引數時,可以使用ClassName :: method (類::例項方法名)

6. 構造器引用

格式:
ClassName::new

注意:

  • 需要呼叫的構造器的引數列表要與函式式介面中抽象方法的引數列表保持一致

7. 陣列引用

格式:
Type[]::new;

Optional類

<1> 概念

Optional是一個容器類,代表一個值存在或不存在,原來用null表示值不存在,現在Optional可以更好的表達這個概念。並且可以避免空指標異常

<2> Optional容器類的常用方法

    • Optional.of(T t):建立一個Optional例項

    • Optional.empty():建立一個空的Optional例項

    • Optional.ofNullable(T t):若t不為null,建立一個Optional例項,否則建立空例項

注意:
  • of方法不能構建null,會報出空指標異常

  • empty只是構建一個空的Optional

  • ofNullable傳入物件就構建物件,傳入null就構建一個空的Optional

  • isPresent():判斷是否包含值

  • orElse(T t):如果呼叫物件包含值,返回該值,否則返回t

  • orElseGet(Supplier s):如果呼叫物件包含值,返回該值 否則返回s獲取的值

  • map(Function f):如果有值對其處理,並返回處理後的Optional,否則返回Optional.empty()

  • flatMap(Function mapper):與map類似,要求返回值必須是Optional

 

 

 

 原文參見公眾號【Java知音】

相關文章