Kotlin Lambda
在探索Kotlin Lambda之前,我們先回顧下Java中的Lambda表達式,Java 的 Lambda 表達式是 Java 8 引入的一項強大的功能,它使得函數式編程風格的代碼更加簡潔和易于理解。Lambda 表達式允許你以一種更簡潔的方式表示實現接口(尤其是函數式接口)的方法。它的主要作用是簡化代碼、減少冗長的匿名類實現,并使得代碼更加靈活。
先看一段代碼:
Runnable runnable = new Runnable() {@Overridepublic void run() {System.out.println("Hello Java");}
};
等效為:
Runnable runnable = () -> System.out.println("Hello Java");
帶參數的和帶返回值的其實是類似的,只要滿足函數式接口都可以使用lambda表達式簡化代碼,這里就不做過多的介紹了。
Kotlin高階函數
在了解Kotlin Lambda之前,我們要先了解Kotlin的高階函數,高階函數是指滿足以下條件之一的函數:
- 將函數作為參數傳遞。
- 返回一個函數作為結果。
//函數作為參數
fun a(b: () -> Int) {b.invoke()
}
//函數作為返回結果
fun c(x: Int): (Int) -> Int {return { number -> number * x }
}fun main() {val multiplier = c(2)println(multiplier(2))
}
函數引用
在Kotlin中可以使用::
對函數進行引用,并且還可以直接引用類似于集合中易經定義的函數,可以簡化代碼
//函數引用
fun d(b: (Int) -> Int): Int {return b.invoke(1)
}fun e(parma: Int): Int {return parma
}val f = ::e
val h = d(::e)
注意:::
對函數進行引用之后,實則是創建了一個對象,并不是函數本身,定義的函數無法調用invoke方法,而函數對象可以:
val m = f(1)// 等同于f.invoke(1)
val l = (::e)(1) //等同于(::e).invoke(1)
匿名函數
匿名函數(也稱為lambda 函數)是一種沒有名稱的函數。它們通常用于作為函數參數傳遞給其他函數,或者簡化某些操作。Kotlin 提供了兩種主要的匿名函數寫法:Lambda 表達式和匿名函數。
- Lambda表達式是一種簡潔的匿名函數寫法,常用于高階函數中。
val lambda = { parma: Int -> { parma * parma } }
- 匿名函數和 Lambda 表達式非常相似,但它們有一些不同的地方,特別是在返回類型和參數類型推斷方面。匿名函數可以顯式地指定返回類型和參數類型,且它允許在函數體內使用 return 語句來返回結果。
val a = fun(parma: Int): String {return parma.toString()
}
注意:lambda不能使用return進行返回操作,而匿名函數可以
Kotlin Lambda
在Java中,我們設置函數式接口類型的對象通常使用匿名內部類或者lambda表達式:
private OnClickListener mListener;interface OnClickListener {void onClick(int value);
}public void setOnClickListener(OnClickListener listener) {this.mListener = listener;
}//匿名內部類
setOnClickListener(new OnClickListener() {@Overridepublic void onClick(int value) {}
});
//lambda
setOnClickListener(value -> {});
在Kotlin中lambda表達式變得更加簡潔和方便
interface Listener {fun onClick(value: Int)
}fun setListener(listener: Listener) {}
//kotlin可以將setListener方法參數傳對象改為高階函數
fun setListener2(onClick: (Int) -> Unit) {}fun test() {//參數接收對象setListener(object : Listener {override fun onClick(value: Int) {println(value)}})//接收一個匿名函數setListener2(fun(value: Int): Unit {println(value)})//匿名函數可以替換為Lambda表達式setListener2({ value -> println(value) })//若接受的函數是參數列表的最后一個參數,可以寫在括號外面setListener2(){ value -> println(value) }//若匿名函數只有一個參數可以省略,kotlin會用it代替它setListener2 { println(it) }
}
最終我們看到了Kotlin Lambda表達式較為簡潔的寫法。kotlin lambda表達式在聲明時已經指定參數類型,因此參數類型可以不寫,而返回值永遠取最后一行代碼的執行結果,因此也不需要指定返回值。Kotlin 匿名函數和Lambda的本質是函數類型的對象,和::
是同樣的效果,而Java 8中的Lambda只是一種簡潔的寫法。