如何使用 Java 8 中的流将几个字段收集到一个列表中?

How to use stream in Java 8 to collect a couple of fields into one list?

例如,我有 class Personnamesurname 字段。

我想从PersonList中收集一个StringList(名字和姓氏一起),但我似乎不能使用每个列表映射两次或每个列表不能使用流两次。

我的代码是:

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 -> person.getName() + " " + person.getSurname)
.collect(Collectors.toList());

当你在做的时候:

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

结果是一个 Set<String>,它只包含 personsname。 然后你从这个 Set 而不是你的 List<Person> persons.

重新创建一个流

这就是为什么你不能使用 Person::getSurname 来映射这个 Set

来自@Alexis C 的解决方案: persons.stream().flatMap(p -> Stream.of(p.getName(), p.getSurname()).collect(Collectors.toSet()) 必须完成任务。

如果某人的名字和中间名可选,则使用下面的代码

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