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

2022-09-02 09:47:36

例如,我有带有姓名姓氏字段的类。Person

我想从 中收集一个(名字和姓氏都在一起),但似乎我不能对一个列表使用两次地图,或者不能在每个列表中使用两次流。ListStringListPerson

我的代码是:

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

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

我做错了什么?


答案 1

要将名字和姓氏放在同一个列表中,您可以执行以下操作:

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

答案 2

当你在做:

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

结果是 仅包含 的 的 。然后,您正在从此处而不是从 .Set<String>namepersonsSetList<Person> persons

这就是为什么你不能用它来映射这个.Person::getSurnameSet

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


推荐