为什么在JAVA 8中有不同的谓词接口?

5

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


1
一个更有趣的问题是,为什么有些原始类型可以做到,而有些则不行。 ;) - Peter Lawrey
1
@PeterLawrey,实际上为什么不是BooleanStream、CharStream等呢?Brian在某个地方说过,这会增加JDK的占用空间,而这些API很少被使用。 - Sleiman Jneidi
@SleimanJneidi 虽然这可能是原因,但我不认为从未使用过的压缩类文件会增加那么多占用空间。 - Peter Lawrey
4个回答

10

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

由于泛型目前不支持基本类型并且需要进行装箱,API为基本类型提供了专门化处理,以避免装箱和拆箱的开销。


9
这些专用谓词接口的目的是在使用基本类型时避免不必要的auto-(un)boxing。例如,如果您需要使用适用于int值的Predicate,则可以使用IntPredicate,并直接将int传递给test(...)方法,而不是需要装箱为Integer对象的Predicate<Integer>。请注意,在Java中,无法使用基本类型作为类型参数(因此,Predicate<int>是不允许的)。

4

不仅仅有Predicates,还有其他具有类型特定变体的函数式接口。原因是支持基本数据类型。

虽然通用版本可以与对象类型(包括DoubleLong等)一起使用,但无法通过泛型使用基本数据类型。也就是说:

Predicate<int> p; //does not compile

例如,IntStream 操作的是 int 类型而不是 Integer 类型,但你不能使用对象类型的函数式接口来处理 int 值,因此你需要针对 int 的特定变量的函数式接口。

0

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

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


只是一个小修正:对于 float 数据类型,没有专门的函数式接口。在我看来,只有 intlongdouble 的包装器可用。 - Priidu Neemre

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接