【发布时间】:2014-05-06 03:27:51
【问题描述】:
如果我编写了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<T, Void>)、Supplier(Function<Void, T>)和IntFunction(Function<Integer, T>)等原始函数。
我还没有深入彻底地考虑过这一切的后果,所以我可能遗漏了一些东西。
编辑:一些答案强调应用和测试之间的语义区别。我并不是说我不欣赏这种区别,我同意拥有这种区别是有益的。我不明白为什么Predicate 也不是Function in,就像List 是Collection 或Double 是Number,这是@ 987654339@.
如果Predicate(以及所有其他特殊的通用功能接口,例如Consumer、Supplier、IntUnaryOperator 等)与Function 有这种关系,则可以在适当的位置使用它其中Function 参数是预期的(想到的是与其他函数的组合,例如调用myFunction.compose(myPredicate) 或避免在API 中编写几个专门的函数,当如上所述的自动(取消)装箱实现就足够了)
编辑 2:查看 openjdk lambda 项目,我发现原始功能接口用于扩展 Function 直到 this commit from Brian Goetz on 2012-12-19。我在当时的任何 lambda-dev 或 JSR 专家组邮件列表中都找不到具体的更改原因。
【问题讨论】:
-
@brian-goetz 是否愿意给出 EDIT 2 的规范答案?
标签: java lambda functional-programming predicate java-8