考慮以下程式碼片段:
Consumer<String> lambda1 = s -> {}; Function<String, String> lambda2 = s -> s; Consumer<String> lambda3 = LambdaTest::consume; // but s -> s doesn't work! Function<String, String> lambda4 = LambdaTest::consume;
根據Consumer 接口,它被定義為void accept(T t);因此,當Consumer 方法回傳一個String 時,人們可能會對 lambda3 的賦值感到困惑。令人驚訝的是,lambda4 也被賦值了。
這種場景歸功於 Java 中方法引用的靈活設計。它允許以與直接呼叫方法相同的方式將方法適應功能介面。換句話說,可以呼叫任何傳回值的方法並忽略回傳值。
Lambda 表達式有兩種形式:
表達式 s -> s 不相容 void,因為 s 不是語句。然而,s-> s.toString() 可以是,因為方法呼叫是語句。
可用作語句的表達式(根據 Java 語言規範第 14.8 節)包括:
限制。 >要注意的是,形式(arg) ->; methodReturningVoid(arg) 是唯一 不相容值的表達式形式。
以上是為什麼帶有傳回值的 Java 方法引用可以與「Consumer」介面一起使用?的詳細內容。更多資訊請關注PHP中文網其他相關文章!