Java: lambda表示式
阿新 • • 發佈:2018-12-28
lambda表示式
- lambda表示式是一個傳遞到某個物件或方法的程式碼塊,可以在以後執行一次或多次。
- lambda表示式形式:
引數 箭頭(->)一個表示式或{多行程式碼}
沒有引數要寫空括號()
例如:
(String first, String second) -> first.length() - second.length();
(String first, String second) -> {
if (first.length() < second.length()) return -1;
else if (first. length() > second.length()) return 1;
else return 0;
}
函式式介面
- 對於只有一個抽象方法的函式式介面,需要這種介面的物件時,就可以提供一個lambda表示式
例如:
Arrays.sort(words, (first, second) -> first.length() - second.length());
Arrays.sort方法第二個引數需要Comparator例項,Comparator是隻有一個方法的介面,可以使用lambda表示式轉換為函式式介面。
再例如lambda轉換為ActionListener介面
Timer t = new Timer(1000, event -> {
System.out.println("The time is " + new Date());
});
變數作用域
- lambda表示式可以捕獲外圍作用域的變數,該變數應為最終變數,表示式內不能改變變數。
- lambda表示式中的this關鍵字,指表示式所在方法的this引數。
例如:
public class A() {
public void init() {
ActionListener listener = event -> {
System. out.println(this.toString());
}
}
}
this.toString()呼叫A物件的toString()
處理lambda表示式
lambda表示式的重點是延遲執行
應用於:
- 一個單獨的執行緒中執行程式碼
- 多次執行程式碼
- 在演算法的適當位置執行(如排序的比較操作)
- 發生某種情況時執行程式碼(如點選按鈕,資料到達)
- 只在必要時執行
若想要重複一個動作20次,寫一個repeat方法
repeat(20, () -> System.out.println("Hello, World!"));
要接受這個lamba表示式,需要選擇一個函式式介面,這裡可以使用Runnable
public static void repeat(int n, Runnable action) {
for (int i = 0; i < n; i++) action.run();
}
更復雜點
repeat(20, i - > System.out.println("Countdown: " + (19 - i)));
public static void repeat(int n, IntConsumer action) {
for (int i = 0; i < n; i++) action.accept(i);
}