5

Qui sto utilizzando il flusso Javaparallel per scorrere un'Elenco e chiamare una chiamata REST con ciascun elemento di elenco come input. Devo aggiungere tutti i risultati della chiamata REST a una raccolta per la quale sto utilizzando uno ArrayList. Il codice riportato di seguito funziona bene, tranne per il fatto che la sicurezza non-thread di ArrayList causerebbe risultati errati e l'aggiunta della sincronizzazione necessaria causerebbe conflitti, minando il vantaggio del parallelismo.Java 8 parallelStream per concomitante chiamata Database/REST

Qualcuno può suggerirmi un modo corretto di utilizzare il flusso parallelo per il mio caso.

public void myMethod() { 
    List<List<String>> partitions = getInputData(); 
    final List<String> allResult = new ArrayList<String>(); 
    partitions.parallelStream().forEach(serverList -> callRestAPI(serverList, allResult); 
} 

private void callRestAPI(List<String> serverList, List<String> allResult) { 
    List<String> result = //Do a REST call. 
    allResult.addAll(result); 
} 

risposta

6

Si può fare l'operazione con map invece di forEach - che garantiscono la sicurezza dei thread (ed è più pulita dal punto di vista di programmazione funzionale):

List<String> allResult = partitions.parallelStream() 
      .map(this::callRestAPI) 
      .flatMap(List::stream) //flattens the lists 
      .collect(toList()); 

E la tua callRestAPI method:

private void callRestAPI(List<String> serverList) { 
    List<String> result = //Do a REST call. 
    return result; 
} 
+2

Penso in particolare che l'aspetto * functional * di questo sia istruttivo –

+0

Non dovrebbe l'ultima riga essere '.collect (Collectors.toList());' – Zeeshan

+2

Ho assunto un 'import java.util.stream.Collectors.toList statico ; '... – assylias

2

Non esiterei a sincronizzare l'accesso a ArrayList. Dato che stai accedendo a un servizio remoto tramite Rest, sospetto che il costo della sincronizzazione sia trascurabile. Misurerei l'effetto prima di passare il tempo ad ottimizzare.

+1

downvoted perché ? –