2015-10-29 10 views
5

sto ottenendo alcuni risultati strani quando si cerca di utilizzare un flusso parallelo e so che una soluzione, ma non sembra l'idealeparallelo flusso dà elementi nulli, come fare in Java 8

// Create the set "selected" 
somethingDao.getSomethingList().parallelStream() 
       .filter(something -> !selected.contains(something.getSomethingId())) 
       .forEach(something -> 
           somethingSubGroupDTO.addFilterDTO(
             new FilterDTO(something.getSomethingName(), something.getSomethingDescription(), false)) 
       ); 
selected.clear(); 

somethingDao.getSomethingList restituisce un List

selected è un che non viene modificato durante questa operazione.

somethingSubGroupDTO.addFilterDTO è una funzione di supporto che si aggiunge a un elenco non sincronizzato. Questo è il problema. Come elenco non sincronizzato ottengo meno elementi nella lista del previsto E alcuni elementi sono nulli. Se lo trasformo in una lista sincronizzata funziona. Ovviamente aggiungere contesa di blocco a un flusso parallelo non è l'ideale.

Al livello alto, so che è possibile farlo in modo tale che ogni stream eseguirà la propria elaborazione e quando si uniranno si aggregheranno. (Almeno posso immaginare un tale processo senza contesa di blocco) Tuttavia, dato che sono nuovo nell'elaborazione del flusso Java 8, non sono a conoscenza di come. Come faccio a fare la stessa operazione senza contesa in un singolo punto?

risposta

8

Non utilizzare forEach e ritirare il flusso in un List invece:

somethingDao.getSomethingList().parallelStream() 
       .filter(something -> !selected.contains(something.getSomethingId())) 
       .map(something -> new FilterDTO(something.getSomethingName(), something.getSomethingDescription(), false)) 
       .collect(toList()); 

Quindi, è possibile impostare la lista restituita direttamente nel vostro somethingSubGroupDTO oggetto, invece di aggiungere un elemento alla volta.

+0

E questo restituisce un elenco che posso quindi aggiungere alla mia raccolta alla fine, piuttosto che uno alla volta? –

+1

@CarlosBribiescas Esattamente – Tunaki

+0

Grazie, questo risponde alla mia domanda. Come follow-up, è possibile indicare quale lista dovrebbe aggregare in modo che alla fine si aggiunga automaticamente? Non necessario, solo curioso. –

Problemi correlati