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 或更高时有效。