Java实现lastnamesByFirstname方法按firstName分组问题
问题根因
单参数的Collectors.groupingBy(Person::getFirstName)默认会将同组的完整Person对象收集为列表,最终返回类型为Map<String, List<Person>>,和要求的Map<String, List<String>>类型不匹配。
正确实现
给groupingBy传入第二个下游收集器参数,通过Collectors.mapping先提取同组元素的lastName字段,再将提取出的姓氏收集为列表即可。
完整代码:
import java.util.List; import java.util.Map; import static java.util.stream.Collectors.groupingBy; import static java.util.stream.Collectors.mapping; import static java.util.stream.Collectors.toList; static Map<String, List<String>> lastnamesByFirstname(List<Person> people){ return people.stream() .collect(groupingBy( Person::getFirstName, mapping(Person::getLastName, toList()) )); }
执行逻辑说明
- 第一个参数
Person::getFirstName:指定分组键为用户的firstName字段 - 第二个参数
mapping(Person::getLastName, toList()):对同分组内的所有元素先做字段映射,只保留lastName值,再将这些字符串值收集为List,最终返回的结果完全符合预期结构:
{ "Mary" -> ["Smith", "Silver"], "Joe" -> ["Smith"] }
内容的提问来源于stack exchange,提问作者Viktor
相关产品推荐
相关产品推荐

