为了账号安全,请及时绑定邮箱和手机立即绑定

当实现 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 关注
  • 157 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信