在 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 接口中使用。