首页 文章

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

提问于
浏览
9

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

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

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

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

我究竟做错了什么?

3 回答

  • 3

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

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

    当你做的时候:

    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()) 必须完成这项工作 .

  • 1

    你的代码应该是这样的:

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

相关问题