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 的新功能