5

在 Java 8 中提供了不同的谓词接口(例如 DoublePredicate、LongPredicate、IntPredicate 等)。现在,如果您要实现接口并在其中编写自己的代码,那么拥有不同的谓词接口有什么好处?为什么不只有一个谓词接口?

4

4 回答 4

9

出于性能原因,存在这些不同的接口。

因为generics不允许原始类型(到目前为止)并且它们需要装箱,所以 API 为原始类型提供了专门化,因此您可以避免装箱和拆箱的成本。

于 2016-06-14T13:22:01.183 回答
8

这些专门的谓词接口的重点是在使用原语时避免不必要的自动(取消)装箱

例如,如果您需要使用Predicate适用于您可以使用的int值的 a,您可以使用IntPredicate它直接将 anint传递给test(...)方法,而不是Predicate<Integer>需要对Integer对象进行装箱的 a。

请注意,在 Java 中,不能使用原始类型作为类型参数(因此,Predicate<int>不允许)。

于 2016-06-14T13:22:31.517 回答
3

不仅有,Predicates还有其他具有特定类型变体的功能接口。原因是,支持原始类型。

虽然通用版本可以与对象类型(包括DoubleLong等)一起使用,但无法将原语与泛型一起使用。IE

Predicate<int> p; //does not compile

例如,IntStream操作 onint和 not on Integer,但您不能对int值使用对象类型的功能接口,因此您需要功能接口的特定于 int 的变体。

于 2016-06-14T13:23:29.303 回答
0

提供这些专门的谓词接口以支持原始数据类型,如 int 或 float 而无需自动装箱。没有它们,我们必须将我们的 int 数据转换为 Integer Object 以在 Predicate 接口中使用。

http://codedestine.com/java-8-predicate-interface/

于 2017-02-07T11:35:17.310 回答