使用Java 8连接集合

Phi*_*das 6 java guava java-8 java-stream

我想迭代一系列集合.有了番石榴,我会这样做:

import static com.google.collections.Iterables.*;

class Group {
    private Collection<Person> persons;
    public Collection<Person> getPersons();
}

class Person {
    private String name;
    public String getName();
}

Collection<Group> groups = ...;
Iterable<Person> persons = concat(transform(groups, Group::getPersons()));
Iterable<String> names = transform(persons, Person::getName);
Run Code Online (Sandbox Code Playgroud)

但是我怎么能用Java 8流做同样的事情呢?

groups.stream().map(Group::getPersons())...?
Run Code Online (Sandbox Code Playgroud)

JB *_*zet 6

Stream<Person> persons = groups.stream().flatMap(g -> g.getPersons().stream());
Run Code Online (Sandbox Code Playgroud)

  • 怎么不优雅?这是一个经典的功能习语,它完全是懒惰的.为什么Streams.concat()会更优雅? (4认同)

ski*_*iwi 6

您可以通过将流的所有元素平面映射到流中来实现此目的.

让我用这段代码解释一下:

groups.stream()
        .flatMap(group -> group.getPersons().stream());
Run Code Online (Sandbox Code Playgroud)

你在这里做的是:

  1. 获得一个Stream<Collection<Group>>.
  2. 然后将每个获得的平面地图Stream<Person>从a Group返回到原始流中,该流是类型的Stream<Person>.

在此之后flatMap(),您可以随意获得所需的任何内容Stream<Person>.