当实现 Predicate 而不是 boolean

我正在阅读一个不相关的线程,当我读到一条评论时:每当我发现自己需要一个多行 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())


哪个是正确的实现?为什么选择一个而不是另一个?有什么大的区别吗?


一只甜甜圈
浏览 163回答 3
3回答

一只斗牛犬

我想你的意思是第二个例子public static Predicate<Table> isUsable(){&nbsp; &nbsp; return table -> table.isEmpty() && table.isClean() && table.hasChair();}这可能已经表明这种形式可能会使读者感到困惑。没有static你可以写table.isUsable(),Table::isUsable但它不会按照你的想法去做。哪个是正确的实现?我更喜欢 ,Table::isUsable因为它也可以用作table.isUsable实例。为什么选择一个而不是另一个?我觉得第一个例子更自然,更容易混淆。第二种形式对于操作谓词更有用,例如 Predicate.or(Predicate)有什么大的区别吗?在这种情况下,使用 Stream 可能会更慢,但更重要的是,更容易混淆。返回 Predicate 的方法的一个优点是它可以添加到任何类中,例如由于某种原因您不能更改 Table。

UYOU

有Predicate<Table> isUsable()假定你总是需要在需要的地方使用的是逻辑Predicate<Table>实例,这是一个限制。另一方面, haveboolean isUsable()使您可以灵活地Table::isUsable在Predicate<Table>需要a的地方使用,或Table::isUsable用作其他一些功能接口的实现(与该方法的签名匹配)或直接调用t.isUsable()特定Table实例。因此我发现这个替代方案更有用。

蓝山帝景

static List<Predicate<Table>> predicateList = Arrays.asList(Table::hasChair, Table::isClean);static boolean isUsable(Table table) {&nbsp; &nbsp; return predicateList.stream().allMatch(p -> p.test(table));}使用 isUsable:List<Table> tablesList = ...Stream<Table> usableTables = tablesList.stream().filter(Table::isUsable);
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java