Java 更新JSONObject时并发修改异常
我有一个JSONObject,如果映射中存在值,我需要重命名一些键。这会不断抛出ConcurrentModificationException。有什么方法可以实现这一点,而不是通过多个循环Java 更新JSONObject时并发修改异常,java,exception,hashmap,Java,Exception,Hashmap,我有一个JSONObject,如果映射中存在值,我需要重命名一些键。这会不断抛出ConcurrentModificationException。有什么方法可以实现这一点,而不是通过多个循环 JSONObject jsonObject = new JSONObject(result); jsonObject.keySet().stream().forEach(key -> { if (someMap.containsKey(key)) { jsonObject.pu
JSONObject jsonObject = new JSONObject(result);
jsonObject.keySet().stream().forEach(key -> {
if (someMap.containsKey(key)) {
jsonObject.put(someMap.get(key), jsonObject.get(key)); //Update the key in jsonObject with same value
jsonObject.remove(key);
}
});
forConcurrentModificationException
解释了这一点:
如果单个线程发出一系列违反对象约定的方法调用,该对象可能会引发此异常。例如,如果线程在使用fail fast迭代器迭代集合时直接修改集合,迭代器将引发此异常
通过从someMap
开始处理您的问题,您不必同时修改,因此引发异常
因此,解决办法可以是:
someMap.entrySet()
.stream()
.filter(entry -> jsonObject.has(entry.getKey()))
.forEach(entry -> {
jsonObject.put(entry.getKey(), entry.getValue());
jsonObject.remove(entry.getKey());
});
我不太明白为什么要先put()
,然后remove()
,但这对解决方案来说并不是必不可少的
我假设您使用的是JSON lib方法,因此您还可以收集到映射:
someMap.entrySet()
.stream()
.filter(entry -> jsonObject.has(entry.getKey()))
.collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));
JSONObject有一个putAll(映射)来快速完成这项工作
那么,无论哪种方法适合您,都需要进行基准测试