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

use*_*644 12 java java-8 java-stream collectors

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

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

persons.stream()
   .map(Person::getName)
   .collect(Collectors.toSet())
   .stream().map(Person::getSurname) 
   .collect(Collectors.toList())
Run Code Online (Sandbox Code Playgroud)

但它一直告诉我,Person静态方法不能引用非静态方法.

我究竟做错了什么?

Lan*_*dei 14

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

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

  • @ user2620644:有一些叫做[文档]的东西(https://docs.oracle.com/javase/8/docs/api/java/util/stream/Stream.html#flatMap-java.util.function.Function-),每个人都应该先读. (3认同)

Mat*_*eta 6

当你在做:

persons.stream().map(Person::getName).collect(Collectors.toSet())
Run Code Online (Sandbox Code Playgroud)

结果是Set<String>只包含namepersons。然后你从这个重新创建一个流,Set而不是从你的List<Person> persons.

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

@Alexis C. 的解决方案: persons.stream().flatMap(p -> Stream.of(p.getName(), p.getSurname()).collect(Collectors.toSet())必须完成这项工作。