我有一个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);
}
});
答案 0 :(得分:1)
ConcurrentModificationException
的{{3}}解释了这一点:
如果单个线程发出违反对象约定的方法调用序列,则该对象可能会抛出此异常。例如,如果线程在使用快速失败迭代器迭代集合时直接修改集合,则迭代器将抛出此异常。
从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(Map map),可以快速完成此任务。
那么哪种方法都适合您比较基准。