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)
当你在做:
persons.stream().map(Person::getName).collect(Collectors.toSet())
Run Code Online (Sandbox Code Playgroud)
结果是Set<String>
只包含name
的persons
。然后你从这个重新创建一个流,Set
而不是从你的List<Person> persons
.
这就是为什么你不能Person::getSurname
用来映射 this Set
。
@Alexis C. 的解决方案:
persons.stream().flatMap(p -> Stream.of(p.getName(), p.getSurname()).collect(Collectors.toSet())
必须完成这项工作。