2017-11-07 3 views
0

私にはMap<String, ClassA> resultsがあります。リスト内の値を編集中のJava ConcurrentModificationException

私はこれを行うと、私はConcurrentModificationExceptionを得る:基本的に

results.entrySet().stream().map((entry) -> { 
    ClassA objA = entry.getValue(); 
    if(objA.getList() != null) { 
     objA.getList().forEach(x -> { 
      if(x.getAttr() != null && x.getAttr.containsKey(key)) { 
       List<String> y = x.getAttr().get(key); 
       y.replaceAll(ClassB::transformationFunc); 
      } 
     }); 
    } 
}) 

私がしようとしている何が私の結果は、にClassAの価値を持っている場合いずれかが存在する場合、リストの各要素をチェックしています指定されたキーを持つ属性。そうであれば、キーの値を与えられた変換関数に置き換えます。

public static String transformationFunc(String input) { 
    try { 
     JSONObject inputJson = (JSONObject) jsonParser.parse(input); 
     return String.format("%s_%s", inputJson.get(key1), inputJson.get(key2)); 
    } catch (ParseException e) { 
     //log 
     //throw 
    } 
} 
+2

[Java Concurrent Modification Exception Error](https://stackoverflow.com/questions/15384486/java-concurrent-modification-exception-error)の可能な複製 –

+2

'ClassB :: transformationFunc'のコードを見ることができますか? –

+0

@AlexandreDupriez transformationFuncで質問が更新されました – user1692342

答えて

4

は基本的に、あなたはあなたが反復処理されているコレクションを変更するたびConcurrentModificationException得ます。

反復処理中のコレクションを変更できる唯一の方法は、明示的にIteratorを使用することです。コレクションの反復処理中にコレクションに対して作業を行う場合は、代わりにコレクションの作業コピーでコレクションを実行する必要があります。

+2

右、OPコードのどこにこれが表示されますか? – Eugene

+0

ストリームを交換する必要がありますか?または、イテレータを使用するためにforeachを変更するだけですか? – user1692342

+0

はい、ストリームを使うことは、暗黙のうちにコレクションに対して繰り返します( 'forEach()'や 'foreach'ループと同じです)。マップのコピーをストリームしなければなりません。 –

関連する問題