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。
TA贡献1878条经验 获得超4个赞
有Predicate<Table> isUsable()
假定你总是需要在需要的地方使用的是逻辑Predicate<Table>
实例,这是一个限制。
另一方面, haveboolean isUsable()
使您可以灵活地Table::isUsable
在Predicate<Table>
需要a的地方使用,或Table::isUsable
用作其他一些功能接口的实现(与该方法的签名匹配)或直接调用t.isUsable()
特定Table
实例。因此我发现这个替代方案更有用。
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);
添加回答
举报