我有一个 Java map :
Map<String, Set<EntityObject>> itemGroupsMap
class EntityObject {
boolean isParent;
String groupId;
}
现在我想将 itemGroupsMap Map --- 转换为 ---:
Map<EntityObject, Set<EntityObject>> parentChildMap.
要做的逻辑是,itemGroupsMap -> Set -> 此 Set 中的每个条目都将有一个 EntityObject 作为父级 (EntityObject.isParent=1)。因此,对于映射中的每个条目,我必须找到父 EntityObject 并将其作为 parentChildMap 的键,并仅将其余的 entitiObjects 作为 Set/List 到此关键。
我尝试过使用 2 个 foreach 循环,而且我对 Java 8 还很陌生,所以我正在寻找如何使用流来减少代码?
我查看了 Collectors.partitioningBy 但它创建了 2 个带有 0、1 键的映射。我真的不需要那个。
有什么建议吗?
最佳答案
也许是这样的:
Map<EntityObject, Set<EntityObject>> newMap = itemGroupsMap.entrySet().stream()
.collect(Collectors.toMap(
entry -> entry.getValue().stream().filter(value -> value.isParent).findFirst().orElse(null),
Map.Entry::getValue
));
注意:
他的代码不关心没有父级的初始 map 中的数据集 -> entry.getValue().stream().filter( value -> value.isParent).findFirst().orElse(null),
它告诉:当集合中没有父项时,将 null
设置为键。因此,如果可能的话,那么每一个没有父项的集合都会被下一个没有父项的集合覆盖。
关于java - 使用 Java 8 Streams 转换 Java 中的映射 - 根据映射的值隔离映射,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61259980/