分组和映射值

问题描述 投票:10回答:1

我正在尝试通过(映射)进行分组,然后将值列表转换为不同的列表。

我有DistrictDocuments列表:

List<DistrictDocument> docs = new ArrayList<>();

然后我在它上面流式传输并按城市分组:

Map<String, List<DistrictDocument>> collect = docs.stream()
                .collect(Collectors.groupingBy(DistrictDocument::getCity));

我还有一个方法,它采用了DistrictDocument并从中创建了Slugable:

private Fizz createFizz(DistrictDocument doc) {
    return new Fizz().name(doc.getName()).fizz(doc.getFizz());
}

有没有办法把这个方法放到我的流上面所以我得到Map<String, List<Fizz>>?我尝试将第二个参数添加到groupingBy但是找不到合适的方法并且总是遇到编译错误。

编辑:如果我的createFizz返回List<Fizz>怎么办?是否可以选择在Collectors.mapping中列出此列表,因为我仍然希望有Map<String, List<Fizz>>而不是Map<String, List<List<Fizz>>>

java java-8 java-stream
1个回答
12
投票

你需要将Collectors.mapping()收集器链接到Collectors.groupingBy()收集器:

Map<String, List<Fizz>> collect =
    docs.stream()
        .collect(Collectors.groupingBy(DistrictDocument::getCity,
                 Collectors.mapping(d->createFizz(d),Collectors.toList())));

如果createFizz(d)将返回List<Fizz,你可以使用Java 9的Collectors.flatMapping来展平它:

Map<String, List<Fizz>> collect =
    docs.stream()
        .collect(Collectors.groupingBy(DistrictDocument::getCity,
                 Collectors.flatMapping(d->createFizz(d).stream(),Collectors.toList())));

如果你不能使用Java 9,也许使用Collectors.toMap会有所帮助:

Map<String, List<Fizz>> collect =
    docs.stream()
        .collect(Collectors.toMap(DistrictDocument::getCity,
                                  d->createFizz(d),
                                  (l1,l2)->{l1.addAll(l2);return l1;}));
© www.soinside.com 2019 - 2024. All rights reserved.