Java 8 では、さまざまな述語インターフェース (DoublePredicate、LongPredicate、IntPredicate など) が提供されています。インターフェイスを実装して独自のコードを記述しようとしている場合、異なる述語インターフェイスを使用する利点は何ですか? 1 つの述語インターフェイスだけではないのはなぜですか?
4 に答える
これらの異なるインターフェイスは、パフォーマンス上の理由から存在します。
(今のところ) プリミティブ型は許可されておらず、ボックス化が必要なためgenerics
、API はプリミティブの特殊化を提供し、ボックス化とボックス化解除のコストを回避します。
これらの特殊な述語インターフェイスのポイントは、プリミティブを操作するときに不要な自動 (非) ボックス化を回避することです。
たとえば、値Predicate
で機能する を使用する必要がある場合は、オブジェクトへのボックス化を必要とするの代わりに、 メソッドに直接渡すことができる を使用できます。int
IntPredicate
int
test(...)
Predicate<Integer>
Integer
Java では、プリミティブ型を型引数として使用できないことに注意してください (したがって、Predicate<int>
許可されていません)。
Predicates
型固有のバリアントを持つ機能インターフェイスだけでなく、他の機能インターフェイスもあります。その理由は、プリミティブ型をサポートしているためです。
一般的なバージョンはオブジェクト型 ( 、 などを含むDouble
)で使用できますがLong
、プリミティブをジェネリックで使用する方法はありません。いえ
Predicate<int> p; //does not compile
たとえば、 は ではなく でIntStream
動作しますが、値に対してオブジェクト型の機能インターフェイスを使用することはできないため、機能インターフェイスの int 固有のバリアントが必要です。int
Integer
int