如何合并List 在分组期间

问题描述 投票:0回答:2

如何在List<String>期间合并groupingBy

给定一个自定义对象EligibilityRequest的列表,其中有一些重复,我需要将那些相等的EligibilityRequest实例分组,然后合并到String列表中一个特定的属性,这对Equals方法没有贡献。

这是详细信息:

public class EligibilityRequest {

 private String channel; // it's part of Equals
 ...

 private List<String> productCodes // it's not part of Equals and need to be aggregated within instance of EligibilityRequest "equal"

}

我尝试了以下方法:

  Map<EligibilityRequest, List<String>> uniqueEligibilityRequests = new HashMap<>();

  uniqueEligibilityRequests = requests.stream()
            .collect(groupingBy(request -> request,
                    Collectors.mapping(request -> request.getProductsCode(), toList())
                    ));

只要productCodes代表字符串而不是List<String>,它就可以工作。我无法弄明白如何在List<String>中合并不同的groupingBy

有人可以帮忙吗?

问候,温琴佐

java grouping collectors
2个回答
0
投票

您拥有的代码适用于创建值为列表列表的映射:

Map<EligibilityRequest, List<List<String>>> result = 
      requests.stream()
              .collect(groupingBy(request -> request,
                    Collectors.mapping(request -> request.getProductsCode(), 
                                       toList())
                ));

如果您的目的是将所有内部列表收集到一个内部列表中,那么您需要这样来展平内部列表:

Map<EligibilityRequest, List<String>> res = 
        requests.stream()
        .collect(Collectors.groupingBy(Function.identity(),
                 Collectors.mapping(
                        EligibilityRequest::getProductCodes,
                        Collectors.collectingAndThen(
                                Collectors.toList(),
                                list -> list.stream()
                                            .flatMap(List::stream)
                                            .collect(Collectors.toList())))
                        )
                );

0
投票

在这种情况下,我发现无流代码更舒适。

public static <K extends Comparable<K>> Map<K, Set<String>> groupBy(List<EligibilityRequest> requests, Function<EligibilityRequest, K> getKey) {
    Map<K, Set<String>> map = new TreeMap<>();

    for (EligibilityRequest request : requests) {
        map.compute(getKey.apply(request), (key, productCodes) -> {
            productCodes = productCodes == null ? new TreeSet<>() : productCodes;
            productCodes.addAll(request.getProductCodes());
            return productCodes;
        });
    }

    return map;
}
© www.soinside.com 2019 - 2024. All rights reserved.