簡體   English   中英

Lambda表達式中的Java代碼是什么意思?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM