ホームページ > Java > &#&チュートリアル > 値が Null の場合、Collectors.toMap が NullPointerException をスローするのはなぜですか?

値が Null の場合、Collectors.toMap が NullPointerException をスローするのはなぜですか?

Susan Sarandon
リリース: 2024-11-10 15:32:03
オリジナル
526 人が閲覧しました

Why Does Collectors.toMap Throw a NullPointerException When Values Are Null?

Collectors.toMap で Null エントリ値を持つ NullPointerException

Collectors.toMap は、値の 1 つが null の場合に NullPointerException をスローします。マップには問題なく null 値を含めることができるため、この動作は驚くべきものです。 Collectors.toMap にこの制限が設けられているのはなぜですか?

この制限の理由は、Collectors.toMap が内部で HashMap を使用するためです。 HashMap ではキーの null 値は許可されませんが、値の null 値は許可されます。ただし、Collectors.toMap はすべての値が null ではないことを前提としており、この前提に違反すると NullPointerException をスローします。

Java 8 には、この問題を解決する優れた方法が提供されていません。従来の単純な for ループに戻すか、次のような回避策を使用できます。

Map<Integer, Boolean> collect = list.stream()
        .collect(HashMap::new, (m,v)->m.put(v.getId(), v.getAnswer()), HashMap::putAll);
ログイン後にコピー

この回避策では、サプライヤーを引数として受け取る HashMap コンストラクターを使用します。サプライヤーは、ストリームが空の場合に新しいマップ インスタンスを作成するために使用されます。この場合、サプライヤーは、デフォルトの容量 16、負荷係数 0.75 で新しい HashMap を作成します。

回避策では、putAll メソッドを使用して、ストリームのすべての要素をマップに追加します。 putAll メソッドは、ストリームの要素をマップにマージし、既存の要素を同じキーに置き換えます。

この回避策は、Collectors.toMap メソッドほど明確ではありませんが、機能します。また、Collectors.toMap では行われない、ストリーム内の要素の順序も保持されます。

以上が値が Null の場合、Collectors.toMap が NullPointerException をスローするのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート