Lev*_*and 4 java predicate java-8 java-stream method-reference
当我读到评论时,我正在阅读一个不相关的帖子:任何时候我发现自己需要一个多行lambda,我将这些行移动到私有方法并传递方法引用而不是lambda.
我在问:实现这种行为的正确方法是什么?使用在注释中发布的布尔方法,还是使用谓词?
例如:让我们说我想检查是否Table可用,其中可用的手段isClean,isEmpty,hasChair.
class Table{
public boolean hasChair(){...}
public boolean isClean(){...}
public boolean isEmpty(){...}
}
Run Code Online (Sandbox Code Playgroud)
我可以List<Table> tablesList = Arrays.asList(table1,table2,table3,table4);用两种方式为我的列表实现我的过滤测试:第一个用布尔值:
public boolean isUsable(){
return hasChair() && isClean() && isEmpty();
}
Run Code Online (Sandbox Code Playgroud)
并使用它 tablesList.stream().filter(Table::isUsable)
第二种方式是谓词:
public Predicate<Table> isUsable(){
return table -> table.isEmpty() && table.isClean() && table.hasChair();
}
Run Code Online (Sandbox Code Playgroud)
适用于 tablesList.stream().filter(isUsable())
哪个是正确的实施?为什么选择一个而不是其他?有什么大不同吗?
我认为你的意思是第二个例子
public static Predicate<Table> isUsable(){
return table -> table.isEmpty() && table.isClean() && table.hasChair();
}
Run Code Online (Sandbox Code Playgroud)
可能已经暗示这种形式可能会使读者感到困惑.没有static你可以写table.isUsable(),Table::isUsable但它不会做你想的.
哪个是正确的实施?
我更喜欢Table::isUsable它,因为它也可以用作table.isUsable实例.
为什么选择一个而不是其他?
我觉得第一个例子更自然,更少混淆.
第二种形式对于操纵谓词更有用,例如Predicate.or(Predicate)
有什么大不同吗?
在这种情况下,使用Stream可能会更慢,但更重要的是,更容易混淆.
返回谓词的方法的一个优点是它可以添加到任何类中,例如,由于某种原因你不能改变表.
假设Predicate<Table> isUsable()您总是需要在需要的地方使用该逻辑Predicate<Table>,这是一个限制。
另一方面,havingboolean isUsable()使您可以灵活地在需要Table::isUsablea 的地方使用 a ,或者用作某些其他功能接口的实现(与该方法的签名匹配)或直接调用特定实例。因此我发现这个替代方案更有用。Predicate<Table>Table::isUsablet.isUsable()Table
| 归档时间: |
|
| 查看次数: |
146 次 |
| 最近记录: |