2016-08-01 11 views
5

मैं जावा 8 धाराओं का उपयोग करता हूं। यहाँ है डेटा संरचना मैं:java8 java.util.ConcurrentModificationException के दौरान प्रत्येक चक्र

Map< String, List<String>> mmessage = getSomeMessage(); 

तब मैं नक्शा और सूची के माध्यम से पुनरावृति:

mmessage.entrySet().stream().forEach(entry -> { 
      entry.getValue().stream().forEach(li -> { 
       if (lis.indexOf(li) == - 1) { 
        lis.add(lineItem); 
       } 
      }); 
     }); 

लेकिन समवर्ती संशोधन अपवाद: मेरी समझ के माध्यम से पुनरावृत्ति से

java.util.ConcurrentModificationException 
    at java.util.ArrayList$ArrayListSpliterator.forEachRemaining(ArrayList.java:1380) 
    at java.util.stream.ReferencePipeline$Head.forEach(ReferencePipeline.java:580) 
    at com.web3.buyer.roomba.RoombaTurn.lambda$received$3(RoombaTurn.java:296) 
    at java.util.Iterator.forEachRemaining(Iterator.java:116) 
    at java.util.Spliterators$IteratorSpliterator.forEachRemaining(Spliterators.java:1801) 
    at java.util.stream.ReferencePipeline$Head.forEach(ReferencePipeline.java:580) 
    at com.web3.buyer.roomba.RoombaTurn.received(RoombaTurn.java:295) 
    at com.web3.buyer.SystemBus.lambda$publishToTheQueue$0(SystemBus.java:51) 
    at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511) 
    at java.util.concurrent.FutureTask.run(FutureTask.java:266) 
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) 
    at java.lang.Thread.run(Thread.java:745) 

मानचित्र \ सूची इस तरह के व्यवहार का कारण नहीं बनना चाहिए।

+2

'lis' क्या है और यह' mmessage' 'Map' से कैसे संबंधित है? – Eran

+7

आप – Jens

+1

पर पुन: सूचीबद्ध सूची में वैलीज नहीं जोड़ सकते हैं @ जेन्स ओपी एक ही सूची में मूल्य नहीं जोड़ रहा है (कम से कम हम अभी तक यह नहीं जानते हैं, क्योंकि हम नहीं जानते कि 'lis' क्या है)। – Eran

उत्तर

14

मैं इसे एक पूर्ण कार्यात्मक शैली का उपयोग करके लिखूंगा और आपको इसे पुन: सक्रिय करते समय सूची को संशोधित करने की समस्या में भाग नहीं लेना चाहिए।

List<String> strs = mmessage.values().stream() 
          .flatMap(List::stream) 
          .distinct() 
          .collect(Collectors.toList()); 
संबंधित मुद्दे