亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

我認為即使謂詞無效,Stream.filter() 也不會顯示編譯時錯誤

我認為即使謂詞無效,Stream.filter() 也不會顯示編譯時錯誤

慕萊塢森 2023-07-19 16:34:46
在下面的代碼中,我有這一行:stream.filter(Data::isEven); 我正在使用 afilter()并且 afilter()接受Predicate接口作為參數。我們都知道Predicate有一種帶有簽名的方法: public boolean test(T t); 它接受一個參數并返回一個布爾值。我的理解是,isEven()不接受參數的方法不是有效的謂詞,因為與test()方法不同,它不接受任何參數,那么為什么我的代碼沒有顯示編譯時錯誤?import java.util.stream.Stream;public class Main App {    public static void main(String args[]) {        Stream<Data> stream =                Stream.of(new Data(4), new Data(1));        stream.filter(Data::isEven); // should throw compile error but doesn't    }}class Data{    int i;    public Data(int i) {        this.i=i;    }    public boolean isEven() {        return i%2==0;    }}
查看完整描述

3 回答

?
慕姐8265434

TA貢獻1813條經驗 獲得超2個贊

問題是,這Data::isEven是一個相當于data -> data.isEven()predicate 的方法引用:

Predicate<Data>?predicate?=?data?->?data.isEven();
//?is?the?same?as
Predicate<Data>?predicate=?Data::isEven;

這在JLS 15.13

ExpressionName實例方法(第 15.12.4.1 節)的目標引用可以通過使用、 aPrimary或 的方法引用表達式來提供,super也可以稍后在調用方法時提供。

....

方法引用表達式的求值會生成函數接口類型的實例(第 9.8 節)。方法引用求值不會導致對應方法的執行;相反,這可能會在稍后調用功能接口的適當方法時發生。

在您的情況下是對對象實例方法的Data::isEven引用。isEvenData


查看完整回答
反對 回復 2023-07-19
?
繁星淼淼

TA貢獻1775條經驗 獲得超11個贊

Data::isEven是一個Predicate.

要調用此方法,您必須傳遞值,例如:myData.isEven()。這本來就是一樣的isEven(myData)。因此,區別僅在于語法(參數在點之前或括號內),但在語義上是相同的。

因此isEven是 aPredicate<Data>因為它接受Data并返回Boolean


查看完整回答
反對 回復 2023-07-19
?
飲歌長嘯

TA貢獻1951條經驗 獲得超3個贊

正如其他人所寫,“Data::isEven”或“data -> data.isEven()”在這里是謂詞。當我們調用此謂詞的測試方法時,我們將數據實例(您有此類實例的流)作為參數傳遞到那里。



查看完整回答
反對 回復 2023-07-19
  • 3 回答
  • 0 關注
  • 151 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號