1. 程式人生 > >Java: lambda表示式

Java: lambda表示式

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