首頁  >  文章  >  Java  >  為什麼帶有傳回值的 Java 方法引用可以與「Consumer」介面一起使用?

為什麼帶有傳回值的 Java 方法引用可以與「Consumer」介面一起使用?

Patricia Arquette
Patricia Arquette原創
2024-11-22 18:04:12506瀏覽

Why Does a Java Method Reference with a Return Value Work with the `Consumer` Interface?

為什麼有回傳類型的Java 方法引用與消費者介面比對

問題

考慮以下程式碼片段:

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 表達式差異

Lambda 表達式有兩種形式:

  1. ( args) ->;表達式:如果表達式求值為某個值,則值相容。
  2. (args) -> { statements* }:如果沒有程式碼路徑嘗試傳回值,則 Void 相容。

表達式 s -> s 不相容 void,因為 s 不是語句。然而,s-> s.toString() 可以是,因為方法呼叫是語句。

相容形式

可用作語句的表達式(根據 Java 語言規範第 14.8 節)包括:

  • 方法呼叫
  • 遞增/遞減運算子
  • 賦值
  • 類別實例建立表達式

限制

限制

限制。 >要注意的是,形式(arg) ->; methodReturningVoid(arg) 是唯一 不相容值的表達式形式。

以上是為什麼帶有傳回值的 Java 方法引用可以與「Consumer」介面一起使用?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn