たとえば、クラスPerson
にnameおよび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
非静的メソッドは静的コンテキストから参照できません。
何が悪いのですか?
同じリストで名前と姓の両方を取得するには、次のようにします。
List<String> set = persons.stream()
.flatMap(p -> Stream.of(p.getName(),p.getSurname()))
.collect(Collectors.toList());
あなたがしているとき:
_persons.stream().map(Person::getName).collect(Collectors.toSet())
_
結果は、name
のpersons
のみを含む_Set<String>
_です。次に、_List<Person> persons
_ではなく、このSet
からストリームを再作成します。
このため、_Person::getSurname
_を使用してこのSet
をマップすることはできません。
@Alexis Cからのソリューション:persons.stream().flatMap(p -> Stream.of(p.getName(), p.getSurname()).collect(Collectors.toSet())
がその仕事をする必要があります。
コードは次のようになります。
persons.stream()
.map(person -> person.getName() + " " + person.getSurname)
.collect(Collectors.toList());
名とミドルネームがオプションの場合、以下のコードを使用します
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));