5

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

4

4 に答える 4

9

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

(今のところ) プリミティブ型は許可されておらず、ボックス化が必要なためgenerics、API はプリミティブの特殊化を提供し、ボックス化とボックス化解除のコストを回避します。

于 2016-06-14T13:22:01.183 に答える
8

これらの特殊な述語インターフェイスのポイントは、プリミティブを操作するときに不要な自動 (非) ボックス化を回避することです。

たとえば、値Predicateで機能する を使用する必要がある場合は、オブジェクトへのボックス化を必要とするの代わりに、 メソッドに直接渡すことができる を使用できます。intIntPredicateinttest(...)Predicate<Integer>Integer

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

于 2016-06-14T13:22:31.517 に答える
3

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

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

Predicate<int> p; //does not compile

たとえば、 は ではなく でIntStream動作しますが、値に対してオブジェクト型の機能インターフェイスを使用することはできないため、機能インターフェイスの int 固有のバリアントが必要です。intIntegerint

于 2016-06-14T13:23:29.303 に答える