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