[解決済み】Collectors.toMapでNullPointerExceptionが発生する。
2022-03-24 18:49:09
質問
Collectors.toMap
を投げる。
NullPointerException
もし値の1つが
null
. この動作が理解できません。マップは値としてNULLポインタを問題なく含むことができます。の値がNULLであってはいけないというのは、何か理由があるのでしょうか?
Collectors.toMap
?
また、この問題を解決するJava 8の方法はありますか、それとも古いfor loopに戻すべきですか?
私の問題の例です。
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
class Answer {
private int id;
private Boolean answer;
Answer() {
}
Answer(int id, Boolean answer) {
this.id = id;
this.answer = answer;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public Boolean getAnswer() {
return answer;
}
public void setAnswer(Boolean answer) {
this.answer = answer;
}
}
public class Main {
public static void main(String[] args) {
List<Answer> answerList = new ArrayList<>();
answerList.add(new Answer(1, true));
answerList.add(new Answer(2, true));
answerList.add(new Answer(3, null));
Map<Integer, Boolean> answerMap =
answerList
.stream()
.collect(Collectors.toMap(Answer::getId, Answer::getAnswer));
}
}
スタックトレース
Exception in thread "main" java.lang.NullPointerException
at java.util.HashMap.merge(HashMap.java:1216)
at java.util.stream.Collectors.lambda$toMap$168(Collectors.java:1320)
at java.util.stream.Collectors$$Lambda$5/1528902577.accept(Unknown Source)
at java.util.stream.ReduceOps$3ReducingSink.accept(ReduceOps.java:169)
at java.util.ArrayList$ArrayListSpliterator.forEachRemaining(ArrayList.java:1359)
at java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:512)
at java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:502)
at java.util.stream.ReduceOps$ReduceOp.evaluateSequential(ReduceOps.java:708)
at java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)
at java.util.stream.ReferencePipeline.collect(ReferencePipeline.java:499)
at Main.main(Main.java:48)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:483)
at com.intellij.rt.execution.application.AppMain.main(AppMain.java:134)
この問題は、Java 11でもまだ存在します。
解決方法は?
これを回避することができます 既知のバグ をOpenJDKで使用する場合、これを使用します。
Map<Integer, Boolean> collect = list.stream()
.collect(HashMap::new, (m,v)->m.put(v.getId(), v.getAnswer()), HashMap::putAll);
そんなにきれいなものではありませんが、うまくいっています。結果です。
1: true
2: true
3: null
( これ のチュートリアルに一番助けられました)。
EDITです。
とは異なり
Collectors.toMap
この場合、@mmdemirbas がコメントで指摘したように、同じキーが複数回あると黙って値を置き換えてしまいます。これを望まない場合は、コメント中のリンクを見てください。
関連
-
[解決済み] 警告: コンテキスト初期化中に例外が発生 - 更新の試みはキャンセルされました。
-
[解決済み] javax.naming.NameNotFoundException
-
[解決済み] Apache Camelのログに簡単なテキストを記録する
-
[解決済み] どのように配列の10未満の値(x * 2)を倍増するコードを取得するには?(Java)
-
[解決済み] 文字列の巻き方
-
[解決済み] Javaコンパイラーエラー:ステートメントではありません
-
[解決済み] .lengthが解決できない、またはフィールドでない
-
[解決済み] JavaでNullPointerExceptionを回避する方法
-
[解決済み] Java Mapの各エントリを効率的に反復処理するには?
-
[解決済み] instanceofを呼び出す前にnullチェックは必要ですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] 未処理の例外タイプIOException」が表示されるのですが?
-
[解決済み] Java - JTextFieldが空かどうかを確認する
-
[解決済み] javaで部分クラスを実装する方法
-
[解決済み] 環境変数JAVA_OPTSの使い方を教えてください。
-
[解決済み] javacが「using unchecked or unsafe operations」という警告を出す原因は何ですか?
-
[解決済み] double 型を Int 型に変換、切り捨て
-
[解決済み] Androidのコールバックとは何ですか?重複
-
[解決済み] スリーピング中のスレッドが割り込まれ、データベースへの接続が失われる
-
[解決済み] Spring ApplicationContext - リソースリーク: 'context' が閉じられない
-
[解決済み】JavaのBooleanとbooleanの比較