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 サイトの他の関連記事を参照してください。