2015-06-11 10 views
8

ich mit einem lookupFunction (die eine Function zurückgibt), wie dieser einen Strom von NameValuePair s Karte Bewerben:eine Liste von Funktionen auf Java Stream des .map() -Methode

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

Aber was, wenn lookupFunction ein zurück Collection<Function> statt, und ich wollte eine .map() mit jedem der zurückgegebenen Function s durchführen. Wie würde ich das tun?

+1

Hinweis: Sie aktuelle Code geschrieben werden könnte: 'stream.map (Namevaluepair :: getName) .map (dieses :: lookupFunction) ...' – assylias

Antwort

3

Wenn lookupFunction(nvp.getName()) eine Sammlung von Funktionen zurückgibt, können Sie einen Stream von dieser Sammlung erhalten und jede Funktion auf das Ergebnis wo es sich auf die Namevaluepair der Anwendung:

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

Dank! Es scheint, ich brauche noch diese zweite .flatMap (Collection :: stream) – neu242

+1

@ neu242 Warum? Gibt jede Funktion :: apply eine Collection anstelle eines einzelnen Werts zurück? Das war nicht klar aus der Frage, weshalb ich die '.flatMap (Collection :: stream)' entfernt habe. – Eran

+0

Ahh natürlich. Ja, das ist der Grund. – neu242

1

ich eine Funktion verwenden würde, dass die komponiert Sammlung von Funktionen in einer Funktion. Und verwenden, die statt lookupFunction in meinem Code

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)) 
... 
Verwandte Themen