2015-10-17 5 views
25

java.utilパッケージのドキュメントをスクロールすると、Optional<T>OptionalIntは互いに関係がないことがわかりました。これは無関係なクラスであることを示唆しているので、これは信じ難いようです。彼らは共通のインターフェースを持っていないのはなぜOptionalInt対オプション任意<Integer>

  1. 、クラス、サブタイプである、または何かは、彼らが持っている関係を明らかにしますか? (彼らはです。その用途を見ると、同じようなクラスのです。)
  2. さらに、OptionalIntクラスを追加する必要があるのはなぜですか?なぜOptional<Integer>を使用できないのですか?私はそれがintが原始であるという事実によると思ったが、矛盾した設計選択であるようにOptionalCharがない。

答えて

16

Java 8では、プリミティブ専用のものが多数導入されています。その理由は、ボクシングプリミティブが多くの無駄な "ボックス"を作成する可能性が高いです。ここで例えば

この

OptionalInt optionalFirst = IntStream 
    .range(0, 100) 
    .filter(i -> i % 23 > 7) 
    .findFirst(); 

、結果としてOptional<Integer>が矛盾することになります。 ifPresent(IntConsumer consumer)のようなメソッドでも、IntStreamの世界にとどまることができます。 Optional<Integer>は、あなたがそれらのすべてがintのように表すことができるので、charまたはshortまたはbyteのための特別なサポートの必要はありません(あなたがしたい場合は、簡単に行うことができます)

変換するのに強制します。欠落しているものはbooleanですが、値が2つしかないのでストリームではあまりできません。

1

OptionalIntは、プリミティブタイプintの値を保持するコンテナです。プリミティブ型は、ジェネリッククラスの型パラメータとして使用できないため、Optional<T>のサブクラスである可能性はありません。

+0

それでは、なぜ「OptionalChar」はありませんか? – Michael

+0

ザッププは質問のコメントに答えました。 –

+0

「オプション」が不十分な理由を理解できません。あなたは例を挙げることができますか? – Michael

6

Java 8のストリームが一貫するようにするには、OptionalIntクラスが必要です。 Stream classを見ると、manyofthemethods返信Optional<T>が表示されます。しかし、Stream<Integer>Stream<Long>またはその他のプリミティブのストリームを扱うことは疲れているので、IntStreamクラスとLongStreamクラスがあり、そのオブジェクトをunboxed値で置き換えます。例えば、Stream<Integer>の要素の和を見つけることがIntStreamのために、あなただけのこれらのクラスでIntStream#sum

を呼ぶのに対し、JDKが親切などOptionalIntOptional<T>OptionalLongを置き換え、そして、簡単ではありません。

関連する問題