为什么不同的谓词接口 n JAVA 8?

Why different predicate interfaces n JAVA 8?

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

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

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

这些专用谓词接口的目的是避免在您使用原语时不必要的auto-(un)boxing

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

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

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

虽然通用版本可以与 object 类型(包括 DoubleLong 等)一起使用,但无法将基元与仿制药。即

Predicate<int> p; //does not compile

例如,IntStream 操作 int 而不是 Integer,但是你不能在 int 值上使用对象类型的函数接口,所以您需要功能接口的特定于 int 的变体。

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

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