收集器根据对象的属性创建List列表

时间:2018-04-26 07:48:02

标签: java collectors

我有以下对象:

列出人员

我想创建以下结构

列表>基于姓氏。

我可以使用groupingBy(p - > p.getFamilyName())将它们分组到Map中。但我不希望有地图,而是列表清单。

您可以使用地图的方法值()分两步完成。但我想知道你是否可以和收藏家一起做。

2 个答案:

答案 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());