例如,我有一个名字和姓氏的人。
我想从人员名单中收集一个字符串列表(姓名和姓氏),但似乎我不能每个列表使用两次地图或者每个列表不能使用两次流。我的代码是:
persons.stream()
.map(Person::getName)
.collect(Collectors.toSet())
.stream().map(Person::getSurname)
.collect(Collectors.toList())
但它一直告诉我,Person::getSurname
非静态方法无法从静态上下文中引用。
我做错了什么?
答案 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));