为什么不同的谓词接口 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 类型(包括 Double
、Long
等)一起使用,但无法将基元与仿制药。即
Predicate<int> p; //does not compile
例如,IntStream
操作 int
而不是 Integer
,但是你不能在 int
值上使用对象类型的函数接口,所以您需要功能接口的特定于 int 的变体。
提供这些专门的谓词接口是为了支持没有自动装箱的原始数据类型,如 int 或 float。没有它们,我们必须将我们的 int 数据转换为 Integer 对象以在 Predicate 接口中使用。
在Java中提供了8种不同的谓词接口(例如DoublePredicate、LongPredicate、IntPredicate等)。现在,如果您要实现接口并在其中编写自己的代码,那么拥有不同谓词接口的优势是什么?为什么不只有一个谓词接口?
出于性能原因存在这些不同的接口。
因为 generics
不允许基元类型(到目前为止)并且它们需要装箱,所以 API 为基元提供专门化,这样您就可以避免装箱和拆箱的成本。
这些专用谓词接口的目的是避免在您使用原语时不必要的auto-(un)boxing。
例如,如果您需要使用适用于 int
值的 Predicate
,您可以使用 IntPredicate
,通过它您可以将 int
直接传递给test(...)
方法,而不是需要装箱到 Integer
对象的 Predicate<Integer>
方法。
请注意,在 Java 中,无法使用原始类型作为类型参数(因此,Predicate<int>
是不允许的)。
不仅 Predicates
还有其他具有特定类型变体的功能接口。原因是,支持 primitive 类型。
虽然通用版本可以与 object 类型(包括 Double
、Long
等)一起使用,但无法将基元与仿制药。即
Predicate<int> p; //does not compile
例如,IntStream
操作 int
而不是 Integer
,但是你不能在 int
值上使用对象类型的函数接口,所以您需要功能接口的特定于 int 的变体。
提供这些专门的谓词接口是为了支持没有自动装箱的原始数据类型,如 int 或 float。没有它们,我们必须将我们的 int 数据转换为 Integer 对象以在 Predicate 接口中使用。