如何在 groupingBy 期间合并 List<String>
How to merge List<String> during groupingBy
如何在 groupingBy
期间合并 List<String>
?
给定一个自定义对象列表 EligibilityRequest
其中有一些重复项,我需要将 EligibilityRequest
的那些实例分组,然后合并到字符串列表中一个特定的 属性 这对 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>
,它就可以工作。我无法弄清楚如何在 groupingBy
.
中合并不同的 List<String>
有人可以帮忙吗?
此致,
文森佐
您拥有的代码适用于创建值是列表列表的地图:
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())))
)
);
在这种情况下,我发现无流代码更舒服。
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;
}
如何在 groupingBy
期间合并 List<String>
?
给定一个自定义对象列表 EligibilityRequest
其中有一些重复项,我需要将 EligibilityRequest
的那些实例分组,然后合并到字符串列表中一个特定的 属性 这对 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>
,它就可以工作。我无法弄清楚如何在 groupingBy
.
List<String>
有人可以帮忙吗?
此致, 文森佐
您拥有的代码适用于创建值是列表列表的地图:
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())))
)
);
在这种情况下,我发现无流代码更舒服。
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;
}