web-dev-qa-db-ja.com

OptionalInt vs Optional <整数>

Java.util パッケージのドキュメントをスクロールすると、Optional<T>OptionalIntは互いに関係がありません。これらは無関係のクラスであることを示唆しているため、これは信じがたいように思えます。

  1. 共通のインターフェイス、クラス、サブタイプ、またはsomethingが関係を明らかにしないのはなぜですか? (それらの使用法を見ると、very同様のクラスです。)
  2. また、なぜ追加のOptionalIntクラスが必要なのですか?なぜあなたは単にOptional<Integer>intが原始的であるという事実によると思いましたが、OptionalCharがないため、一貫性のない設計選択になります。
37
Michael

Java 8では、プリミティブ専用の多くの機能が導入されました。理由は、ボクシングプリミティブが多くの無駄な「ボックス」を作成する可能性が高いためです。

例えばこれ

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

ここでは、結果としての_Optional<Integer>_は矛盾します。また、ifPresent(IntConsumer consumer)などのメソッドは、IntStreamの世界に留まることを可能にします。 _Optional<Integer>_は変換を強制します(必要に応じて簡単に変換できます)

charまたはshortまたはbyteを特別にサポートする必要はありません。これらはすべてintとして表現できるためです。欠落しているのはbooleanですが、値が2つしかないため、ストリームでできることはあまりありません。

30
zapl

Java 8のストリームの一貫性を保つにはOptionalIntクラスが必要です。 Stream class を見ると、 、 多くoftheメソッド return Optional<T>が表示されます。ただし、 Stream<Integer>Stream<Long>、またはプリミティブの他のストリームが使い果たされているため、 IntStream クラスと LongStream オブジェクトをボックス化されていない値に置き換えるクラス。たとえば、Stream<Integer>の要素の合計を見つけるのは簡単ではありませんが、IntStreamの場合は IntStream#sum

これらのクラスでは、JDKはOptional<T>OptionalIntOptionalLongなどに置き換えて役立ちます。

11
Justin

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

3
Jiri Tousek