如果我编写
我在想,Java 8 API的设计者选择将Predicate与Function完全分开是否有令人信服的原因?他们是否考虑过这样做并决定不这样做?我猜类似的问题也适用于所有其他“特殊”的函数接口,如Consumer(可以是Function),Supplier(Function)和原始函数,如IntFunction(Function)。我没有深入和彻底地考虑所有这些问题,所以我可能会漏掉一些东西。编辑:一些答案强调了应用和测试之间的语义区别。我不是说我不欣赏这种区别,我同意这种区别是有益的。我的困惑是为什么Predicate仍然不像List是Collection或Double是Number那样也是Function in的一种方式,即Object。
如果
Predicate
接口,我希望在接口中编码它只是一个返回基本类型boolean
的函数,就像这样:@FunctionalInterface
public interface Predicate<T> extends Function<T, Boolean> {
boolean test(T t);
@Override
default Boolean apply(T t) {
return Boolean.valueOf(test(t));
}
}
我在想,Java 8 API的设计者选择将Predicate与Function完全分开是否有令人信服的原因?他们是否考虑过这样做并决定不这样做?我猜类似的问题也适用于所有其他“特殊”的函数接口,如Consumer(可以是Function),Supplier(Function)和原始函数,如IntFunction(Function)。我没有深入和彻底地考虑所有这些问题,所以我可能会漏掉一些东西。编辑:一些答案强调了应用和测试之间的语义区别。我不是说我不欣赏这种区别,我同意这种区别是有益的。我的困惑是为什么Predicate仍然不像List是Collection或Double是Number那样也是Function in的一种方式,即Object。
如果
Predicate
(以及其他所有特殊的泛型函数接口,例如Consumer
、Supplier
、IntUnaryOperator
等)与Function
有这种关系,那么它允许在期望Function
参数的地方使用它(想到的是与其他函数的组合,例如调用myFunction.compose(myPredicate)
或在API中避免编写多个专门的函数,当上述自动(解)装箱实现足够时)。
编辑2:查看openjdk lambda项目,我发现原始函数接口一直扩展Function
,直到Brian Goetz在2012-12-19提交此更改。我找不到该时间段任何lambda-dev或JSR专家组邮件列表上的具体原因。