问题
If I have 2 collections,
List<String> domainArr;
List<Person> personArr;
I would like to make a minor transformation on each of the elements in the String and then iterate over the personArr to
List<String> urlArr = strArr.stream()
.map(str -> "https://" + strArr)
.collect(Collectors.toList());
I have a method like
List<Person> getPersons(String url){
/*makes a restful call to the url and gets a List of objects for each URL.*/
}
I would like to iterate over each of the urls from urlArr and pass it to the getPersons(url) method and for each of the obtained result (a List), I would like to iterate over the person and perform more operations on the persons like
persons.stream()
.filter(Objects::nonNull)
.map(Person::getName)
.filter(Objects::nonNull)
.collect(Collectors.toList());
I am hoping to have all the person names here from all the results.
I was wondering how to do this the functional way in Java 8. Any pointers?
回答1:
You can use flatMap
to convert your stream of List<T>
into flat stream of T
strArr.stream()
.map(str -> "https://" + strArr)
.map(url -> getPersons(url))
.flatMap(persons -> persons.stream())
.filter(Objects::nonNull)
.map(Person::getName)
.filter(Objects::nonNull)
.collect(Collectors.toList());
来源:https://stackoverflow.com/questions/47657202/performing-an-operation-over-the-elements-of-one-collection-and-iterating-over-t