6

コレクションのコレクションを繰り返し処理したい。グアバを使用すると、次のようになります。

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);

しかし、Java 8 ストリームで同じことを行うにはどうすればよいでしょうか?

groups.stream().map(Group::getPersons())...?
4

3 に答える 3

6
Stream<Person> persons = groups.stream().flatMap(g -> g.getPersons().stream());
于 2014-04-06T11:19:43.553 に答える
6

これは、ストリームのすべての要素をストリームにフラット マッピングすることで実現できます。

このコードで説明しましょう:

groups.stream()
        .flatMap(group -> group.getPersons().stream());

ここで行うことは次のとおりです。

  1. を取得しStream<Collection<Group>>ます。
  2. Stream<Person>次に、 a から取得したすべての をフラット マップGroupし、タイプ の元のストリームに戻しますStream<Person>

の後、flatMap()取得した で好きなことを行うことができますStream<Person>

于 2014-04-06T11:21:01.853 に答える
2

私はあなたが必要だと思いますflatMap

Stream<Person> persons = groups.stream().flatMap(g -> g.getPersons().stream());
于 2014-04-06T11:20:42.743 に答える