【发布时间】:2019-09-19 11:31:45
【问题描述】:
是否可以使用Collectors.groupingBy() 和Collectors.counting() 来计算自定义对象的字段,而不是创建地图并随后对其进行转换。
我有一个用户列表,如下所示:
public class User {
private String firstName;
private String lastName;
// some more attributes
// getters and setters
}
我想统计所有具有相同名字和姓氏的用户。因此,我有如下自定义对象:
public static class NameGroup {
private String firstName;
private String lastName;
private long count;
// getters and setters
}
我可以使用这个来收集名称组:
List<NameGroup> names = users.stream()
.collect(Collectors.groupingBy(p -> Arrays.asList(p.getFirstName(), p.getLastName()), Collectors.counting()))
.entrySet().stream()
.map(e -> new NameGroup(e.getKey().get(0), e.getKey().get(1), e.getValue()))
.collect(Collectors.toList());
使用此解决方案,我必须首先将用户分组到地图,然后将其转换为我的自定义对象。是否可以将所有名称直接计数到nameGroup.count 以避免在列表(或映射)上重复两次并提高性能?
【问题讨论】:
标签: java java-stream grouping counting