# Lambda 是什麼?
Lambda
表達式是一小段代碼,它接受參數並返回一個值。Lambda
表達式類似於方法,但它們不需要名稱,並且可以直接在方法中實現。
# 語法
最簡單的使用方式,就是只使用一個參數和一個表達式:
parameter -> expression |
使用 ()
可以傳入多個參數:
(parameter1, parameter2) -> expression |
上面的使用必須立即返回一個值,並不能包含宣告變數、賦值或 if
或 for
之類的語句。
因此,為了進行更複雜的操作,程式碼區塊可以搭配大括號 {}
一起使用。
如果 Lambda
表達式需要返回一個值,那麼代碼塊應該有一個 return
語句。
(parameter1, parameter2) -> { code block } |
感覺是不是超像 javascript
的箭頭函式阿~~
# 使用 Lambda 表達式
Lambda
表達式通常作為參數傳給函式:
使用 Lambda
表達式在 ArrayList
的 forEach()
裡輸出 list
內容。
public static void main(String[] args) { | |
ArrayList<Integer> numbers = new ArrayList<Integer>(); | |
numbers.add(5); | |
numbers.add(9); | |
numbers.add(8); | |
numbers.add(1); | |
numbers.forEach((n) -> System.out.println(n)); | |
} |
如果變數的類型是只有一個方法的介面,則 Lambda
表達式可以存儲在變數中。lambda
表達式應該與該方法具有相同數量的參數和相同的返回類型。Java
內置了許多此類介面,例如列表使用的 Consumer
介面(在 java.util 包中)。
public static void main(String[] args) { | |
ArrayList<Integer> numbers = new ArrayList<Integer>(); | |
numbers.add(5); | |
numbers.add(9); | |
numbers.add(8); | |
numbers.add(1); | |
Consumer<Integer> method = (n) -> { System.out.println(n); }; | |
numbers.forEach( method ); | |
} |
要在方法中使用 lambda
表達式,該方法應該有一個參數,其類型為單方法介面。
調用介面的方法將運行 lambda
表達式:
interface StringFunction { | |
String run(String str); | |
} | |
public class Main { | |
public static void main(String[] args) { | |
StringFunction exclaim = (s) -> s + "!"; | |
StringFunction ask = (s) -> s + "?"; | |
printFormatted("Hello", exclaim); | |
printFormatted("Hello", ask); | |
} | |
public static void printFormatted(String str, StringFunction format){ | |
String result = format.run(str); | |
System.out.println(result); | |
} | |
} |