import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.IntStream;
public class HelloWorld{
public static void main(String[] args) {
Map<String, String> map = new HashMap<>();
IntStream.range(0, 20).forEach(i -> map.put(Integer.toString(i), i % 2 == 0 ? null : "ok"));
for (Map.Entry<String, String> entry : map.entrySet()) {
if (entry.getValue() == null) {
map.remove(entry.getKey());
}
}
}
}
这是一个示例代码,我试图从给定的Hashmap中删除空值。但是这段代码给出了ConcurrentModificationException。知道如何解决这个问题吗?
编辑:感谢YCF_L,如果我用map.entrySet().removeIf(entity -> entity.getValue() == null);
问题2:
如果散列图是嵌套的,该怎么办?
例如:
public static void removeEmptyValues(Map<String, Object> entityMap) {
for (Map.Entry<String, Object> entry : entityMap.entrySet()) {
String key = entry.getKey();
Object value = entry.getValue();
if (value == null) {
entityMap.remove(key);
} else if (value instanceof Map) {
removeEmptyValues((Map) value);
if (((Map) value).isEmpty()) {
entityMap.remove(key);
}
}
}
}
答案 0 :(得分:2)
您可以使用Collection::removeIf
这样解决此问题:
map.entrySet().removeIf(entity -> entity.getValue() == null);
抛出此错误的原因是您同时迭代Hashmap的值,通过删除值来更改它,然后继续迭代。这就是引发异常的原因。
另见答案:
Iterating through a Collection, avoiding ConcurrentModificationException when removing in loop