2016-06-14 22 views
0

在Java 8中提供了不同的謂詞接口(例如DoublePredicate,LongPredicate,IntPredicate等)。現在,如果要實現接口並在其中編寫自己的代碼,具有不同謂詞接口的優點是什麼?爲什麼不只是一個謂詞接口?爲什麼不同的謂詞接口n JAVA 8?

+0

更有趣的問題是通過做一些原始類型而不是其他的。 ;) –

+1

@PeterLawrey其實它是爲什麼不是BooleanStream,CharStream ....? Brian表示,它會增加很少使用的API的JDK佔用空間。 –

+0

@SleimanJneidi儘管可能是這個原因,但我沒有想象那些從未使用過的壓縮類文件會增加足跡。 –

回答

3

這些專用謂詞接口的要點是在處理原語時避免不必要的auto-(un)boxing

例如,如果你需要使用一個Predicateint價值的作品,你可以使用IntPredicate,使用它可以直接傳遞一個inttest(...)方法,而不是一個Predicate<Integer>需要拳擊的Integer對象。

請注意,在Java中,不可能使用基本類型作爲類型參數(因此,不允許使用Predicate<int>)。

6

出於性能原因,存在這些不同的接口。

因爲generics不允許原始類型(到目前爲止)並且他們需要裝箱,所以API爲原語提供了專門化,因此您可以避免裝箱和取消裝箱的成本。

2

不僅僅有Predicates,還有其他具有類型特定變體的功能接口。原因是,支持原始的類型。

雖然一般版本可以與對象類型(包括DoubleLong等)一起使用,也沒有辦法利用原語與泛型。即

Predicate<int> p; //does not compile 

例如,IntStream運行在int,而不是Integer,但你不能int值使用對象類型的功能接口,所以您需要的功能接口的IN​​T-特定變體。