如何使用 Java 8 中的流将几个字段收集到一个列表中?
How to use stream in Java 8 to collect a couple of fields into one list?
例如,我有 class Person
和 name 和 surname 字段。
我想从Person
的List
中收集一个String
的List
(名字和姓氏一起),但我似乎不能使用每个列表映射两次或每个列表不能使用流两次。
我的代码是:
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>
,它只包含 persons
的 name
。
然后你从这个 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));
例如,我有 class Person
和 name 和 surname 字段。
我想从Person
的List
中收集一个String
的List
(名字和姓氏一起),但我似乎不能使用每个列表映射两次或每个列表不能使用流两次。
我的代码是:
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>
,它只包含 persons
的 name
。
然后你从这个 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));