Как объединить Список <String>во время группировки - PullRequest
0 голосов
/ 24 февраля 2019

Как объединить 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.

Может ли кто-то там помочь?

С уважением, Винченцо

Ответы [ 2 ]

0 голосов
/ 24 февраля 2019

В данной ситуации я считаю, что код без потока удобнее.

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;
}
0 голосов
/ 24 февраля 2019

Код, который у вас есть, подходит для создания карты, в которой значения являются списками списков:

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())))
                        )
                );
...