如何在java 8中使用流将一些字段收集到一个列表中?

时间:2017-02-03 15:54:52

标签: java java-8 java-stream collectors

例如,我有一个名字和姓氏的人。

我想从人员名单中收集一个字符串列表(姓名和姓氏),但似乎我不能每个列表使用两次地图或者每个列表不能使用两次流。我的代码是:

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

但它一直告诉我,Person::getSurname非静态方法无法从静态上下文中引用。

我做错了什么?

4 个答案:

答案 0 :(得分:11)

要在同一个列表中同时获取姓名和姓氏,您可以这样做:

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

答案 1 :(得分:4)

当你在做的时候:

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

结果是Set<String>仅包含name的{​​{1}}。 然后,您要从此persons而不是Set重新创建一个流。

这就是为什么你不能使用List<Person> persons来映射这个Person::getSurname

来自@Alexis C.的解决方案: Set必须完成这项工作。

答案 2 :(得分:2)

您的代码看起来应该是这样的:

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

答案 3 :(得分:0)

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

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