2015-06-11 3 views
8

traccio un flusso di NameValuePair s con un lookupFunction (che restituisce una Function), in questo modo:Applicare un elenco di funzioni per .map di un flusso di Java() metodo

List<NameValuePair> paramPairs = getParamPairs(); 
List<NameValuePair> newParamPairs = paramPairs.stream() 
       .map((NameValuePair nvp) -> lookupFunction(nvp.getName()).apply(nvp)) 
       .flatMap(Collection::stream) 
       .collect(toList()); 

Ma cosa succede se lookupFunction restituito un Collection<Function> invece, e volevo eseguire uno .map() con ciascuno dei valori restituiti Function s. Come potrei farlo?

+1

Nota: si codice corrente potrebbe essere scritto: 'stream.map (NameValuePair :: getName) .map (questo :: lookupFunction) ...' – assylias

risposta

3

Se lookupFunction(nvp.getName()) restituisce un insieme di funzioni, è possibile ottenere un flusso di che Raccolta e mappare ogni funzione al risultato dell'applicazione al NameValuePair:

List<NameValuePair> newParamPairs = paramPairs.stream() 
      .flatMap((NameValuePair nvp) -> lookupFunction(nvp.getName()).stream().map(func -> func.apply(nvp))) 
      .flatMap(Collection::stream) 
      .collect(toList()); 
+0

Grazie! Sembra che io abbia ancora bisogno di quella seconda .flatMap (Collection :: stream) – neu242

+1

@ neu242 Perché? Ogni funzione :: apply restituisce una raccolta anziché un singolo valore? Questo non era chiaro dalla domanda, ed è per questo che ho rimosso '.flatMap (Collection :: stream)'. – Eran

+0

Ah, certo. Sì, questa è la ragione. – neu242

1

userei una funzione che compone la Collezioni di funzioni in un'unica funzione. E l'uso che, invece di lookupFunction nel mio codice

Function<String, Function<NameValuePair, NameValuePair>> composedFun = 
    x -> lookupFunctions(x) 
      .stream() 
      .reduce((fun1, fun2) -> fun1.andThen(fun2)) 
      .orElse(y -> y); 
... 
    .map(nvp -> composedFun.apply(nvp.getName()).apply(nvp)) 
...