报告 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,用 computeIfAbsent()merge() 替换可能会对某些 Map 实现产生错误。 在默认情况下,如果这段代码可能有副作用,则不会出现警告。 如有必要,启用 建议替换,即使 lambda 可能有副作用选项,以始终显示警告。

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

此检查仅在项目或模块的语言版本为 8 或更高中有效。

2016.3 的新功能