2015-06-11 12 views
8

mapować strumień NameValuePair sz lookupFunction (która zwraca Function), podobnie jak to:Zastosuj listę funkcji do .map strumienia języka Java() metoda

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

ale co jeśli lookupFunction zwrócił Collection<Function> zamiast tego i chciałem wykonać .map() z każdym zwróconym Function s. Jak to zrobić?

+1

Uwaga: aktualny kod mógł być napisany: 'stream.map (NameValuePair :: getName) .map (ta :: lookupFunction) ...' – assylias

Odpowiedz

3

Jeśli lookupFunction(nvp.getName()) zwraca zbiór funkcji, można uzyskać strumień tej kolekcji map i każdej funkcji w wyniku zastosowania go do NameValuePair:

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

Dzięki! Wydaje się, że nadal potrzebuję tej drugiej .flatMap (Collection :: stream) – neu242

+1

@ neu242 Dlaczego? Czy każda funkcja :: apply zwraca kolekcję zamiast pojedynczej wartości? To nie było jasne z tego pytania, dlatego usunąłem '.flatMap (Collection :: stream)'. – Eran

+0

Ahh, oczywiście. Tak, to jest powód. – neu242

1

bym wykorzystać funkcję, która komponuje Kolekcje funkcji w jedną funkcję. I używać zamiast lookupFunction w moim kodu

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)) 
... 
Powiązane problemy