[英]What does this Java code in Lambda expression mean?
Handler handler = new Handler(Looper.getMainLooper() );
Runnable workRunnable;
@Override public void afterTextChanged(Editable s) {
handler.removeCallbacks(workRunnable);
workRunnable = () -> search(s.toString());
handler.postDelayed(workRunnable, 500 /*delay*/);
}
這個表達是什么意思?
workRunnable = () -> search(s.toString());
在普通的Java代碼中,它是如何編寫的?
這樣做:
workRunnable = () -> search(s.toString());
與執行相同:
workRunnable = new Runnable() {
@Override
public void run() {
search(s.toString());
}
};
實際上,低級實現是不同的,lambda不僅僅是編譯器添加的語法糖,即,它們未在內部轉換為匿名內部類。 但是,當匿名內部類擴展功能接口 (只有一種抽象方法的接口)時,從語義的角度來看,兩者的含義幾乎相同。
一個區別是,在匿名內部類中,如果引用this
,則將引用匿名內部類的實例;而在lambda中,如果引用this
,則將引用封閉的類的實例,其中lambda已定義。
您可能想閱讀The Java Tutorial中有關lambda的課程 ,其中解釋了lambda及其使用方法。
Lambda是單方法接口的匿名實現。 它們可以是任何單一方法接口,但內置的接口包括:
() -> doSomethingButDonTReturnAnything() // Runnable
() -> returnV() // Supplier<V>
x -> doSomethingWithXButDontRetunAnything(x) // Consumer<K>
x -> returnVFromX(x) // Function<K,V>
(x, y) -> doSomethingWithXAndYButDontReturnAnything(x,y) // BiConsumer<K,V>
(x, y) -> doSomethingWithXAndYAndReturnM(x, y) // BiFunction<K,V,M>
()僅表示沒有輸入參數。 也有諸如IntFunction和Predicate之類的原始版本。 任何實現所需接口的代碼都可以在lambda內使用,即Stream :: map的函數可以是帶K並返回V的任何東西。一個限制是內置接口不會引發異常,因此您必須如果要使用引發異常的lambda,請滾動自己的接口。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.