Null エントリ値を持つ Collectors.toMap で NullPointerException が発生しました
はじめに
Java 8 の場合, Collectors.toMap は、キーと値のペアのストリームからマップを作成するための便利な方法です。ただし、ストリーム内の値の 1 つが null の場合、このメソッドは NullPointerException をスローします。マップには問題なく null 値を含めることができることを考えると、これは奇妙に思えます。
Null 例外の理由
この動作の背後にある理由は、コレクタのデフォルトの実装です。 toMap は、基礎となるデータ構造として HashMap を使用します。 HashMap ではキーの null 値は許可されませんが、値の null 値は許可されます。ただし、Collectors.toMap はキーの null 値を検出すると、その値のデフォルト値 (null) を使用しようとします。その結果、NullPointerException が発生します。
Java 8 Solution
Java 8 でこの問題を解決するには、手動で HashMap を作成し、それにストリームからのキーと値のペアを入力するという回避策を使用できます。
Map<Integer, Boolean> collect = list.stream() .collect(HashMap::new, (m,v)->m.put(v.getId(), v.getAnswer()), HashMap::putAll);
これ回避策は特に洗練されたものではありませんが、期待される結果、つまりストリームからのキーと値のペアを含む Map が生成され、ストリーム内で null 値を持つキーには null 値が含まれます。
考慮事項
この回避策には次の考慮事項があることに注意することが重要です。
これらの考慮事項がユースケースで受け入れられない場合は、代替案を検討する必要があるかもしれません。別の Collector 実装を使用するか、単純な古い for ループに戻すなどのアプローチです。
以上がCollectors.toMap が Null エントリ値を持つ NullPointerException をスローするのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。