我正在阅读 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。