簡體   English   中英

將lambda作為參數傳遞給泛型類型-Java 8

[英]Passing lambda as parameter with generic type - java 8

如果我有一個方法foo(Predicate bar) ,則可以在下一個使用它:

foo(new Predicate<MyObject>() {
        public boolean apply(MyObject obj) { 
           return true;
        }
    }
)

但是如何使用lambda樣式的表達式達到相同的結果:

foo((MyObject obj) -> true); //obvious compile exception

如何將帶有lambda的泛型類型傳遞給方法? 或者,簡單地講,如何使用不帶局部變量的lambda樣式創建Predicate(或其他)類的匿名對象。

不要使用原始類型foo(Predicate<? extends MyObject> bar)

或在Lambda foo(obj -> ((MyObject) obj).myMethod())

如果您的目標類型是原始類型,例如在調用foo(Predicate bar) ,您就無法期望lambda表達式能夠為您神奇地生成適當的類型。 它與匿名內部類一起使用,因為該聲明具有顯式類型( Predicate<MyObject> {} ),該類型可以通過不安全的操作傳遞給Predicate 但是lambda表達式沒有類型。 它們被轉換為目標類型,在您的調用中,目標類型為Predicate

如果要通過lambda表達式創建Predicate<MyObject> ,則需要Predicate<MyObject>作為目標類型:

Predicate<MyObject> p = o -> /* note that o has the type MyObject */true;
foo(p);

要么

foo((Predicate<MyObject>)o -> /* here, o has the type MyObject as well*/true);

要么

void fooHelper(Predicate<MyObject> p) {
    foo(p);
}
…
fooHelper(o -> /* here, o has again the type MyObject*/true);

當然,在所有這些情況下,您也可以編寫(MyObject o) -> true ,但是此參數的顯式聲明對使用此lambda表達式創建的實例的類型沒有影響。

請注意,第二個變體具有類型轉換的形式結構,但是在運行時不會進行類型轉換操作。 它僅用於指定lambda表達式的目標類型(類似於加寬用於在方法調用中選擇特定重載的轉換)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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