报告 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));

请注意,如果提取到 lambda 表达式的代码修改了相同的 Map,对于某些 Map,替换为 computeIfAbsent()merge() 可能无法正常使用。 在默认情况下,如果这段代码有副作用,则不会出现警告。 如有必要,启用建议替换,即使 lambda 可能有副作用选项,以始终显示警告。

此外,由于 put() 等旧方法和 computeIfAbsent()merge() 等新方法中对 null 值的不同处理,语义可能会改变,如果将 null 值存储到给定的 Map 中很重要,您需要考虑这一点。 当值是静态已知为 null 时,该检查不会建议进行替换。但对于可 null 性未知的值,仍然建议进行替换。 在这些情况下,我们建议禁止警告并添加说明注释。

此检查仅在项目或模块的语言级别为 8 或更高时有效。