ホームページ  >  記事  >  Java  >  Collectors.toMap が Null エントリ値を持つ NullPointerException をスローするのはなぜですか?

Collectors.toMap が Null エントリ値を持つ NullPointerException をスローするのはなぜですか?

Linda Hamilton
Linda Hamiltonオリジナル
2024-11-11 21:44:03387ブラウズ

Why Does Collectors.toMap Throw a NullPointerException with Null Entry Values?

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 値が含まれます。

考慮事項

この回避策には次の考慮事項があることに注意することが重要です。

  • Collectors.toMap とは異なり、同じキーが複数回ある場合、黙って値を置き換えます。
  • 基盤となるデータ構造として HashMap を使用しますが、すべてのシナリオに適しているとは限りません。

これらの考慮事項がユースケースで受け入れられない場合は、代替案を検討する必要があるかもしれません。別の Collector 実装を使用するか、単純な古い for ループに戻すなどのアプローチです。

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

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。