一般的な java.util.Map の使用パターンを報告し、 getOrDefault()computeIfAbsent()putIfAbsent()merge()、または replaceAll() への置換を提案します。

例:


  map.containsKey(key) ? map.get(key) : "default";

クイックフィックス適用後:


  map.getOrDefault(key, "default");

例:


  List<String> list = map.get(key);
  if (list == null) {
    list = new ArrayList<>();
    map.put(key, list);
  }

クイックフィックス適用後:


  map.computeIfAbsent(key, localKey -> new ArrayList<>());

例:


  Integer val = map.get(key);
  if (val == null) map.put(key, 1);
  else map.put(key, val + 1);

クイックフィックス適用後:


  map.merge(key, 1, (localKey, localValue) -> localValue + 1);

例:


  for (Map.Entry<String, String> entry : map.entrySet()) {
    map.put(entry.getKey(), transform(entry.getValue()));
  }

クイックフィックス適用後:


  map.replaceAll((localKey, localValue) -> transform(localValue));

ラムダ式に抽出されるコードが同じ Map を修飾している場合、一部の Map の実装では computeIfAbsent() または merge() への置換が正常に機能しない可能性があります。 このコードに副作用があると思われる場合でも、デフォルトでは警告は表示されません。 警告を常に表示する必要がある場合は、「ラムダに副作用があると思われる場合も置換を提案する」オプションを有効にします。

put() のような古いメソッドや computeIfAbsent() / merge() のような新しいメソッドでは null 値の処理が異なるため、セマンティクスが変更される可能性があります。指定の Mapnull 値を格納することが重要な場合、この事を考慮する必要があります。 対象の値が静的に nullable であると分かっている場合、このインスペクションは置換を提案しません。ただし、null 許容性が不明な値については、置換が提案されます。 そのような場合は、警告を抑止して、説明用のコメントを追加することをお勧めします。