Java8流将集合转换为单个值

Java8流将集合转换为单个值,java,java-8,java-stream,Java,Java 8,Java Stream,我有以下流,它返回一个Map: Map collect=conditions.stream().collect(groupingBy(Condition::getKey,mapping(Condition::getValues,toList()); 我的对象条件具有以下属性: String key; List<String> values; 字符串键; 列表值; 如何将此返回转换为映射,排除重复项并保留相同的密钥 谢谢 如果要继续执行groupingBy,请执行以下操作: Ma

我有以下流,它返回一个
Map

Map collect=conditions.stream().collect(groupingBy(Condition::getKey,mapping(Condition::getValues,toList());
我的对象条件具有以下属性:

String key;
List<String> values;
字符串键;
列表值;
如何将此返回转换为
映射
,排除重复项并保留相同的密钥


谢谢

如果要继续执行
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())));

如果您使用的是Java 9+,您可以这样使用:

Map<String, List<String>> collect = conditions.stream()
        .collect(groupingBy(Condition::getKey, collectingAndThen(flatMapping(
                condition -> condition.getValues().stream(), toSet()
        ), ArrayList::new)));
Map collect=conditions.stream()
.collect(groupingBy)(条件::getKey,collectingAndThen(flatMapping(
condition->condition.getValues().stream(),toSet()
),ArrayList::new));

因为要过滤重复项,它首先收集到
集合
,然后将其转储到
阵列列表

您尝试了什么?你被困在哪里了?我被困在尝试将此集合转换为一个单一值,正如我在期望的返回中所告知的。因此,简而言之,你有一个
映射到
列表
,你只需确保
列表
的转换……类似于
列出一些;List res=some.stream().flatMap(Collection::stream).collect(toList())也许只是为了你地图的值?我的疑问是,排除重复项意味着什么?你能在回答中解释一下这一部分吗?嗨,空指针,在我的实体中,我可以在值中有重复的字符串。@Nogueira那么你想从哪里删除重复的字符串呢?我的意思是假设
条件
是一个
列表
,不是吗?刚刚意识到我之前的评论可能听起来有点混乱(因此被删除),所以这里有另一个尝试-->“我的疑问是,排除重复项意味着什么?”,因此,首先我们分组,然后应用映射,生成
Map
,然后OP希望每个
列表
转换为
列表
,其中该列表仅包含“不同”元素。分组仍然是必需的,因为我们需要每个
条件
的分组的所有
列表
。我们可以将其简化为:
Map collect=conditions.stream().collect(groupingBy(Condition::getKey,flatMapping(Condition->Condition.getValues().stream().distinct(),toList())?使用
distinct
会阻止创建中间
@LuCio,这是行不通的。您正在调用
distinct
,调用的是
条件.getValues()
的结果,该条件已返回一个
集(因此没有重复项)。这里的要点是在具有相同键的两个条件之间查找重复值(例如,如果
condition1.getKey().equals(condition2.getKey())
,则一些
condition1.getValues()
可以重复
condition2.getValues()
)。你说得对。我错过了OP的
collect
是一个
Map
,它的值属于
Set
的类型
List
。在由
集合支持的
流上调用
distinct
没有意义。
Map<String, Set<String>> result = conditions.stream()
                .collect(toMap(Condition::getKey, f -> new HashSet<>(f.getValues()), 
                    (l, r) -> {l.addAll(r);return l;}));
Map<String, List<String>> collect = conditions.stream()
        .collect(groupingBy(Condition::getKey, collectingAndThen(flatMapping(
                condition -> condition.getValues().stream(), toSet()
        ), ArrayList::new)));