2016-06-14 6 views
0

Java 8の異なる述語インターフェース(例:DoublePredicate、LongPredicate、IntPredicateなど)が提供されています。インターフェイスを実装して独自のコードを記述する場合、異なる述語インターフェイスを使用する利点は何ですか?なぜ1つの述語インターフェースだけではないのですか?なぜ異なる述語インタフェースn JAVA 8?

+0

より興味深い質問がによってによって、いくつかのプリミティブ型ではなく他人を行うだろう。 ;) –

+1

@ PeterLawrey実際にはなぜBooleanStream、CharStream ....ではないのですか? Brianは、まれにしか使用しないAPIのJDKのフットプリントを増やす場所をいくつか挙げています。 –

+0

@SleimanJneidiそれはおそらく理由ですが、決して使用されていない圧縮されたクラスファイルがそれほど足跡を増やしていないことをイメージしません。 –

答えて

3

これらの特殊な述語インターフェイスのポイントは、プリミティブを使用しているときに不要なauto-(un)boxingを避けることです。

たとえば、あなたがint値で動作Predicateを使用する必要がある場合、あなたはどのであなたの代わりにIntegerオブジェクトにボクシングを必要とPredicate<Integer>の、test(...)方法に直接intを渡すことができIntPredicateを使用することができます。

Javaでは、型引数としてプリミティブ型を使用できないことに注意してください(Predicate<int>は使用できません)。

6

これらの異なるインターフェイスは、パフォーマンス上の理由から存在します。

genericsはプリミティブ型を許可していないため(これまでのところ)、ボクシングが必要なため、APIはプリミティブの特殊化を提供し、ボクシングとアンボックスのコストを回避します。

2

Predicatesだけでなく、タイプ固有のバリアントを持つ他の機能的なインターフェイスもあります。理由は、サポートプリミティブタイプです。

一般的なバージョンは、(Double含む、Longなど)オブジェクトタイプで使用することができるが、ジェネリックとプリミティブを使用するための方法はありません。私。

Predicate<int> p; //does not compile 

は例えば、IntStreamIntegerintはなく上で動作していますが、機能インタフェースのint型固有のバリアントを必要とするので、あなたは、int値にオブジェクト型指定された機能インタフェースを使用することはできません。

0

これらの特殊な述語インタフェースは、autoboxingなしでintやfloatのようなプリミティブ型をサポートするために用意されています。それらがなければ、Predicateインターフェースで使用するためにintデータをInteger Objectに変換する必要があります。

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

関連する問題