Java 8流将Set转换为单个值

时间:2018-11-30 10:25:02

标签: java java-8 java-stream

我有以下流返回MyModel

create

我的对象Condition具有以下属性:

update

如何将退货转换为Map<String, List<Set<String>>>,排除重复项并保持相同的密钥?

谢谢!

2 个答案:

答案 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