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

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

當實現 Predicate 而不是 boolean

當實現 Predicate 而不是 boolean

一只甜甜圈 2021-12-01 15:49:44
我正在閱讀一個不相關的線程,當我讀到一條評論時:每當我發現自己需要一個多行 lambda 時,我都會將這些行移動到一個私有方法并傳遞方法引用而不是 lambda。我在問:實現這種行為的正確方法是什么?使用評論中發布的布爾方法還是謂詞?示例:假設我想檢查 aTable是否可用,其中可用意味著isClean, isEmpty, hasChair。class Table{    public boolean hasChair(){...}    public boolean isClean(){...}    public boolean isEmpty(){...}}我可以List<Table> tablesList = Arrays.asList(table1,table2,table3,table4);通過兩種方式為我的列表實現過濾測試:第一種是布爾值:public boolean isUsable(){    return hasChair() && isClean() && isEmpty();}并使用它 tablesList.stream().filter(Table::isUsable)第二種方式是使用謂詞:public Predicate<Table> isUsable(){    return table -> table.isEmpty() && table.isClean() && table.hasChair();}可與 tablesList.stream().filter(isUsable())哪個是正確的實現?為什么選擇一個而不是另一個?有什么大的區別嗎?
查看完整描述

3 回答

?
一只斗牛犬

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

我想你的意思是第二個例子


public static Predicate<Table> isUsable(){

    return table -> table.isEmpty() && table.isClean() && table.hasChair();

}

這可能已經表明這種形式可能會使讀者感到困惑。沒有static你可以寫table.isUsable(),Table::isUsable但它不會按照你的想法去做。


哪個是正確的實現?


我更喜歡 ,Table::isUsable因為它也可以用作table.isUsable實例。


為什么選擇一個而不是另一個?


我覺得第一個例子更自然,更容易混淆。


第二種形式對于操作謂詞更有用,例如 Predicate.or(Predicate)


有什么大的區別嗎?


在這種情況下,使用 Stream 可能會更慢,但更重要的是,更容易混淆。


返回 Predicate 的方法的一個優點是它可以添加到任何類中,例如由于某種原因您不能更改 Table。


查看完整回答
反對 回復 2021-12-01
?
UYOU

TA貢獻1878條經驗 獲得超4個贊

Predicate<Table> isUsable()假定你總是需要在需要的地方使用的是邏輯Predicate<Table>實例,這是一個限制。

另一方面, haveboolean isUsable()使您可以靈活地Table::isUsablePredicate<Table>需要a的地方使用,或Table::isUsable用作其他一些功能接口的實現(與該方法的簽名匹配)或直接調用t.isUsable()特定Table實例。因此我發現這個替代方案更有用。


查看完整回答
反對 回復 2021-12-01
?
藍山帝景

TA貢獻1843條經驗 獲得超7個贊

static List<Predicate<Table>> predicateList = Arrays.asList(Table::hasChair, Table::isClean);


static boolean isUsable(Table table) {

    return predicateList.stream().allMatch(p -> p.test(table));

}

使用 isUsable:


List<Table> tablesList = ...

Stream<Table> usableTables = tablesList.stream().filter(Table::isUsable);


查看完整回答
反對 回復 2021-12-01
  • 3 回答
  • 0 關注
  • 191 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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