Java 更新JSONObject时并发修改异常

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,如果映射中存在值,我需要重命名一些键。这会不断抛出ConcurrentModificationException。有什么方法可以实现这一点,而不是通过多个循环

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);
    }
});
for
ConcurrentModificationException
解释了这一点:

如果单个线程发出一系列违反对象约定的方法调用,该对象可能会引发此异常。例如,如果线程在使用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(映射)来快速完成这项工作

那么,无论哪种方法适合您,都需要进行基准测试