我有以下流返回MyModel
:
create
我的对象Condition具有以下属性:
update
如何将退货转换为Map<String, List<Set<String>>>
,排除重复项并保持相同的密钥?
谢谢!
答案 0 :(得分:4)
如果您要继续进行groupingBy
,则可以这样做:
Map<String, List<String>> result = conditions.stream()
.collect(groupingBy(Condition::getKey, mapping(Condition::getValues, toList())))
.entrySet().stream()
.collect(toMap(f -> f.getKey(), f -> f.getValue().stream()
.flatMap(List::stream).distinct().collect(toList())));
但这对于带有合并功能的toMap
可能更紧凑:
Map<String, Set<String>> result = conditions.stream()
.collect(toMap(Condition::getKey, f -> new HashSet<>(f.getValues()),
(l, r) -> {l.addAll(r);return l;}));
答案 1 :(得分:1)
如果您使用的是Java 9+,则可以像这样使用Collectors.flatMapping
:
Map<String, List<String>> collect = conditions.stream()
.collect(groupingBy(Condition::getKey, collectingAndThen(flatMapping(
condition -> condition.getValues().stream(), toSet()
), ArrayList::new)));
由于要过滤出重复项,因此它首先收集到Set
,然后将其转储到ArrayList
。