web-dev-qa-db-ja.com

Java 8でストリームを使用して、いくつかのフィールドを1つのリストに収集する方法は?

たとえば、クラスPersonnameおよびsurnameフィールドが含まれています。

List of StringからList of Person(名前と姓をまとめて)を収集したいのですが、マップを使用できないようですリストごとに2回、またはリストごとに2回ストリームを使用することはできません。

私のコードは:

persons.stream()
   .map(Person::getName)
   .collect(Collectors.toSet())
   .stream().map(Person::getSurname) 
   .collect(Collectors.toList())

でもPerson::getSurname非静的メソッドは静的コンテキストから参照できません。

何が悪いのですか?

13
user2620644

同じリストで名前と姓の両方を取得するには、次のようにします。

List<String> set = persons.stream()
  .flatMap(p -> Stream.of(p.getName(),p.getSurname()))
  .collect(Collectors.toList());
13
Landei

あなたがしているとき:

_persons.stream().map(Person::getName).collect(Collectors.toSet())
_

結果は、namepersonsのみを含む_Set<String>_です。次に、_List<Person> persons_ではなく、このSetからストリームを再作成します。

このため、_Person::getSurname_を使用してこのSetをマップすることはできません。

@Alexis Cからのソリューション:persons.stream().flatMap(p -> Stream.of(p.getName(), p.getSurname()).collect(Collectors.toSet())がその仕事をする必要があります。

4
Matthieu Saleta

コードは次のようになります。

persons.stream()
.map(person -> person.getName() + " " + person.getSurname)
.collect(Collectors.toList());
2
matejetz

名とミドルネームがオプションの場合、以下のコードを使用します

return Stream.of(Optional.ofNullable(person)
.map(Person::getFirstName)
.orElse(null),
Optional.ofNullable(person)
.map(Person::getMiddleName)
.orElse(null))
.filter(Objects::nonNull)
.collect(Collectors.joining(SPACE));
0