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?
E questo restituisce un elenco che posso quindi aggiungere alla mia raccolta alla fine, piuttosto che uno alla volta? –
@CarlosBribiescas Esattamente – Tunaki
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. –