Operazioni su più flussi
-
20-12-2019 - |
Domanda
Ecco cosa sto facendo: Ho un evento da un feed RSS che mi sta dicendo che un biglietto è stato modificato.Per ottenere le modifiche apportate a quel biglietto, devo chiamare un servizio di riposo.
Quindi volevo farlo con un approccio funzionale più compatto, ma è appena trasformato in un mucchio di follia.Quando infatti, il vecchio stile diretto Java è questo semplice:
/**
* Since the primary interest is in what has been changed, we focus on getting changes
* often and pushing them into the appropriate channels.
*
* @return changes made since we last checked
*/
public List<ProcessEventChange> getLatestChanges(){
List<ProcessEventChange> recentChanges = new ArrayList<>();
List<ProcessEvent> latestEvents = getLatestEvents();
for (ProcessEvent event : latestEvents){
recentChanges.addAll(getChanges(event));
}
return recentChanges;
}
.
C'erano una coppia domande qui che correlate a questo che non sembrano avere risposte semplici, sto facendo questa domanda in modo che ci sia un esempio molto specifico e la domanda è cristallina: funziona con la lavorazione di questo con flussi eSe sì, come?
Se i flussi non sono buoni per cose del genere, non sono davvero buoni per molto.La ragione per cui dico questo è questo è un requisito molto comune: che alcuni dati siano arricchiti con ulteriori informazioni da un'altra fonte.
Soluzione
Quello di cui hai bisogno è flatmap, che può mappare un singolo oggetto ProcessEvent
dell'elenco di ingresso a più oggetti ProcessEventChange
e appiattire tutti gli oggetti su un singolo flusso di generatori di generazione.
List<ProcessEventChange> recentChanges = getLatestEvents().
stream().
flatMap(e -> getChanges(e).stream()).
collect(Collectors.toList());
.