我有以下对象:
列出人员
我想创建以下结构
列表>基于姓氏。
我可以使用groupingBy(p - > p.getFamilyName())将它们分组到Map中。但我不希望有地图,而是列表清单。
您可以使用地图的方法值()分两步完成。但我想知道你是否可以和收藏家一起做。
答案 0 :(得分:3)
您可以使用collectingAndThen
:
ArrayList<List<Person>> collect = stream.collect(
Collectors.collectingAndThen(Collectors.groupingBy(Person::getFamilyName),
m -> new ArrayList<>(m.values())));
首先应用groupingBy
,然后为每个分组值创建ArrayList
。
答案 1 :(得分:1)
您可以使用groupingBy
收集,然后将entrySet
重新整理到您的列表中。
List<Map.Entry<String, List<Person>>> families = people.stream()
.collect(Collectors.groupingBy(p -> p.familyName))
.entrySet()
.stream()
.collect(Collectors.toList());
System.out.println(families);
如果您不需要姓氏作为密钥,那么只需在最终收集之前添加.map(e -> e.getValue())
:
List<List<Person>> families = people.stream()
.collect(Collectors.groupingBy(p -> p.familyName))
.entrySet()
.stream()
.map(e -> e.getValue())
.collect(Collectors.toList());
或只是简化values
:
List<List<Person>> families = people.stream()
.collect(Collectors.groupingBy(p -> p.familyName))
.values()
.stream()
.collect(Collectors.toList());