在Java 8中,提供了不同的谓词接口(例如DoublePredicate、LongPredicate、IntPredicate等)。现在,如果您要实现接口并编写自己的代码,拥有不同的谓词接口有什么优势?为什么不只使用一个谓词接口?
在Java 8中,提供了不同的谓词接口(例如DoublePredicate、LongPredicate、IntPredicate等)。现在,如果您要实现接口并编写自己的代码,拥有不同的谓词接口有什么优势?为什么不只使用一个谓词接口?
这些不同的接口存在是出于性能原因。
由于泛型
目前不支持基本类型并且需要进行装箱,API为基本类型提供了专门化处理,以避免装箱和拆箱的开销。
int
值的Predicate
,则可以使用IntPredicate
,并直接将int
传递给test(...)
方法,而不是需要装箱为Integer
对象的Predicate<Integer>
。请注意,在Java中,无法使用基本类型作为类型参数(因此,Predicate<int>
是不允许的)。不仅仅有Predicates
,还有其他具有类型特定变体的函数式接口。原因是支持基本数据类型。
虽然通用版本可以与对象类型(包括Double
、Long
等)一起使用,但无法通过泛型使用基本数据类型。也就是说:
Predicate<int> p; //does not compile
IntStream
操作的是 int
类型而不是 Integer
类型,但你不能使用对象类型的函数式接口来处理 int
值,因此你需要针对 int
的特定变量的函数式接口。这些专门的谓词接口是为了支持原始数据类型,如int或float而提供的,避免了自动装箱。如果没有它们,我们必须将int数据转换为Integer对象才能在Predicate接口中使用。
float
数据类型,没有专门的函数式接口。在我看来,只有 int
、long
和 double
的包装器可用。 - Priidu Neemre