java - 使用 Java 8 Streams 转换 Java 中的映射 - 根据映射的值隔离映射

标签 java object java-8 hashmap set

我有一个 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/

相关文章:

java-8 - 使用 Java 8 S4U2Proxy - 需要一个很好的例子

java - 如何在 collect 的 java 流中将 Map<String, Person> 转换为 Map<String, Integer>?

java - ListView 所选项目突出显示来自数据库?

java - JAXB 将不需要的 namespace 声明附加到标记

java - 在 VC 中部署 Java 应用程序而不包括生产凭据

php - 如何在没有 fixture 的情况下在 Yii PHPUnit 测试中创建模型对象?

objective-c - 创建类似 NSString 的 Objective-C 文字对象

java - 从 Calendar.getTime() 设置日期值时年份不正确

c# - 在 C# 中引用一个对象

java - 如何将以下java代码转换为java 8?