我正在阅读 not related thread ,当我读到一条评论时:每当我发现自己需要一个多行 lambda 时,我都会将这些行移动到一个私有(private)方法并传递方法引用而不是 lambda。

我在问:实现这种行为的正确方法是什么?使用评论中发布的 boolean 方法还是谓词?

例子:
假设我想检查 Table 是否可用,其中可用意味着 isClean , isEmpty , hasChair

class Table{
    public boolean hasChair(){...}
    public boolean isClean(){...}
    public boolean isEmpty(){...}
}

我可以通过两种方式为我的列表 List<Table> tablesList = Arrays.asList(table1,table2,table3,table4); 实现我的过滤测试:第一种是 boolean 值:
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()) 一起使用

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

最佳答案

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

public static Predicate<Table> isUsable(){
    return table -> table.isEmpty() && table.isClean() && table.hasChair();
}

这可能已经表明这种形式可能会使读者感到困惑。如果没有 static,您可以编写 table.isUsable()Table::isUsable,但它不会按照您的想法行事。



我更喜欢 Table::isUsable 因为它也可以用作实例的 table.isUsable



我觉得第一个例子更自然,更少混淆。

第二种形式对于操作谓词更有用,例如谓词.或(谓词)



在这种情况下,使用 Stream 可能会更慢,但更重要的是,更容易混淆。

返回 Predicate 的方法的一个优点是它可以添加到任何类中,例如由于某种原因,您不能更改 Table。

10-08 12:03