2017-12-05 2 views
2

Diese Frage ist eine Erweiterung zu this. Ich habe hier alle notwendigen Details zur Verfügung gestellt.Das Ergebnis einer Iteration für ein Objekt in einer Karte mit Werten von einem anderen Objekt sammeln

Wenn ich 2 Sammlungen haben,

List<String> domainArr; 
List<Person> personArr; 

würde Ich mag eine kleine Transformation auf jedes der Elemente in dem String machen und dann über den personArr iterieren ein zu

List<String> urlArr = strArr.stream() 
    .map(str -> "https://" + strArr) 
    .collect(Collectors.toList()); 

Ich habe Verfahren wie

List<Person> getPersons(String url){ 
/*makes a restful call to the url and gets a List of objects for each URL.*/ 
} 

ich von here weiß, dass ich die Wieder sammeln kann gebnisse in eine abgeflachte Liste wie

strArr.stream() 
    .map(str -> getPersons("https://" + str)) 
    .flatMap(persons -> persons.stream()) 
    .filter(Objects::nonNull) 
    .map(Person::getName) 
    .filter(Objects::nonNull) 
    .collect(Collectors.toList()); 

Ich frage mich, wie in einer Karte mit Schlüssel als domainUrl und Wert als eine Liste von Namen durch die Umwandlung des Ergebnisses dieser speziellen URL erhielt das Ergebnis bekommen? wie

Say Karte,

URL1 -> [name1, name2] 
URL2 -> [name3, name4] 
+1

'domainArr' und' strArray' sind gleich? Welche Arten möchte die Karte erhalten? – user1803551

Antwort

-1

Sie den Code unten verwenden können, wo resultMap ist das, was Sie suchen:

domainArr.stream() 
      .forEach(domain -> { 
       String url = "https://" + domain; 
       List<Person> persons = getPersons(url); 
       Map<String, List<String>> resultMap = persons.stream() 
         .filter(Objects::nonNull) 
         .map(Person::getName) 
         .filter(Objects::nonNull) 
         .collect(Collectors.toMap(a -> url, Arrays::asList, (a, b) -> { 
          a.addAll(b); 
          return a; 
         })); 

      }); 
4

Zur besseren Lesbarkeit können Sie eine separate Methode definieren, extrahiert die Liste der Namen für eine URL:

List<String> personNames(String url) { 
    return getPersons(url).stream() 
      .filter(Objects::nonNull) // why would you return null persons? 
      .map(Person::getName) 
      .filter(Objects::nonNull) // why would... nevermind! :) 
      .collect(Collectors.toList()); 
} 

Dann schreiben Sie können:

strArr.stream() 
     .map("https://"::concat) // Your code here says `.map(str -> "https://" + strArr)`, which I suppose should be `.map(str -> "https://" + str)` 
     .collect(Collectors.toMap(Function.identity(), this::personNames)); 
Verwandte Themen