在Java 8中提供了不同的谓词接口(例如DoublePredicate,LongPredicate,IntPredicate等)。现在,如果您要实现接口并在其中编写自己的代码,那么拥有不同谓词接口的优势是什么?为什么不只是一个谓词界面?
答案 0 :(得分:7)
出于性能原因,存在这些不同的接口。
由于generics
不允许原始类型(到目前为止)并且它们需要装箱,因此API为原语提供了专门化,因此您可以避免装箱和拆箱的成本。
答案 1 :(得分:5)
这些专用谓词接口的目的是在使用基元时避免不必要的data format。
例如,如果您需要使用适用于Predicate
值的int
,则可以使用IntPredicate
将int
直接传递给test(...)
1}}方法,而不是需要装箱到Predicate<Integer>
对象的Integer
。
请注意,在Java中,不可能将原始类型用作类型参数(因此,不允许Predicate<int>
)。
答案 2 :(得分:3)
不仅有Predicates
,还有其他具有特定类型变体的功能接口。原因是,支持原语类型。
虽然通用版本可以与对象类型(包括Double
,Long
等)一起使用,但是无法使用带有泛型的基元。即。
Predicate<int> p; //does not compile
例如,IntStream
在int
而非Integer
上运行,但您无法在int
值上使用对象类型的功能接口,因此您需要功能接口的int特定变体。
答案 3 :(得分:0)
提供这些专用谓词接口以支持原始数据类型,如int或float,而不进行自动装箱。没有它们,我们必须将我们的int数据转换为Integer Object以在Predicate接口中使用。