java - 使用过滤器和流将 Map<String, Object> 转换为 Map<String, Set<Object>>

标签 java lambda java-8 java-stream

我想转换我的 map ,如下所示:

{
  key="someKey1", value=Apple(id="1", color="green"),
  key="someKey2", value=Apple(id="2", color="red"),
  key="someKey3", value=Apple(id="3", color="green"),
  key="someKey4", value=Apple(id="4", color="red"),
}

到另一张 map ,它将所有相同颜色的苹果放在同一个列表中:

{
  key="red", value=list={apple1, apple3},
  key="green", value=list={apple2, apple4},  
}

我尝试了以下方法:

Map<String, Set<Apple>> sortedApples = appleMap.entrySet()
    .stream()
    .collect(Collectors.toMap(l -> l.getColour, ???));

我在正确的轨道上吗?我应该为此任务使用过滤器吗?有没有更简单的方法?

最佳答案

Collectors.groupingByCollectors.toMap 更适合此任务(尽管两者都可以使用)。

Map<String, List<Apple>> sortedApples = 
    appleMap.values()
            .stream()
            .collect(Collectors.groupingBy(Apple::getColour));

或者,要将它们分组到 Set 中,请使用:

Map<String, Set<Apple>> sortedApples = 
    appleMap.values()
            .stream()
            .collect(Collectors.groupingBy(Apple::getColour,
                                           Collectors.mapping(Function.identity(),
                                                              Collectors.toSet())));

或者(正如青峰评论的那样):

Map<String, Set<Apple>> sortedApples = 
    appleMap.values()
            .stream()
            .collect(Collectors.groupingBy(Apple::getColour, Collectors.toSet()));

关于java - 使用过滤器和流将 Map<String, Object> 转换为 Map<String, Set<Object>>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54005438/

相关文章:

Java 相当于 Perl 的 s///运算符?

c# - LINQ to SQL lambda 表达式。 OrderBy、Case When、Dynamic Where

python - 在 lambda 中使用 __iadd__?

java - 如何在 Set 中返回一个不同的对象并求和一个公共(public)值?

java - 在 Java 8 中从整数数组减少到 double

java - MyEclipse 10 无法启动 "Java was started but returned exit code 13"

java - 标记 "]"出现语法错误,此标记后应有 VariableDeclaratorld

java - ElasticSearch无法解析日期字段

java - 具有多个参数的 Kotlin lambda

lambda - 使用 Java 8 Stream API 展平 map 并关联值