在 Java 8 中提供了不同的谓词接口(例如 DoublePredicate、LongPredicate、IntPredicate 等)。现在,如果您要实现接口并在其中编写自己的代码,那么拥有不同的谓词接口有什么好处?为什么不只有一个谓词接口?
4 回答
出于性能原因,存在这些不同的接口。
因为generics
不允许原始类型(到目前为止)并且它们需要装箱,所以 API 为原始类型提供了专门化,因此您可以避免装箱和拆箱的成本。
这些专门的谓词接口的重点是在使用原语时避免不必要的自动(取消)装箱。
例如,如果您需要使用Predicate
适用于您可以使用的int
值的 a,您可以使用IntPredicate
它直接将 anint
传递给test(...)
方法,而不是Predicate<Integer>
需要对Integer
对象进行装箱的 a。
请注意,在 Java 中,不能使用原始类型作为类型参数(因此,Predicate<int>
不允许)。
不仅有,Predicates
还有其他具有特定类型变体的功能接口。原因是,支持原始类型。
虽然通用版本可以与对象类型(包括Double
、Long
等)一起使用,但无法将原语与泛型一起使用。IE
Predicate<int> p; //does not compile
例如,IntStream
操作 onint
和 not on Integer
,但您不能对int
值使用对象类型的功能接口,因此您需要功能接口的特定于 int 的变体。
提供这些专门的谓词接口以支持原始数据类型,如 int 或 float 而无需自动装箱。没有它们,我们必须将我们的 int 数据转换为 Integer Object 以在 Predicate 接口中使用。