当前位置: 首页 > 知识库问答 >
问题:

通过lambda从列表构建地图

姬雪松
2023-03-14

我有一个Group模型,其中包含一个内部字段List

如何通过lambda和流将以下代码更改为一行

 Map<String, String> entityGroup = new HashMap<>();
 groups.forEach(g -> g.getEntities()
                .forEach(e -> entityGroup.put(e.getKey(), g.getKey()))
 );

内部列表中的每个实体都应该是映射中的键,值应该是组本身

谢谢


共有2个答案

郁宾鸿
2023-03-14

这是一个可运行的示例,不需要您像上面的解决方案那样显式创建新条目:

import java.util.*;
import java.util.stream.*;

public class MyClass {
    public static void main(String args[]) {
        List<B> b1 = List.of(new B("a", "1"), new B("b", "2"));
        List<B> b2 = List.of(new B("x", "3"), new B("y", "4"));
        A a1 = new A(b1);
        A a2 = new A(b2);
        List<A> allAs = List.of(a1, a2);
        Map<String, String> map =
               allAs.stream().flatMap(a -> a.vals.stream())
               .collect(Collectors.toMap(B::getKey, B::getValue));
        System.out.println(map); // {a=1, b=2, x=3, y=4}
    }
}

class A {
    List<B> vals;
    public A(List<B> vals) { this.vals = vals; }
}

class B {
    String k, v;
    public B(String k, String v) { this.k = k; this.v = v; }
    public String getKey() { return this.k; }
    public String getValue() { return this.v; }
}
卜和悌
2023-03-14
匿名用户

要使用streams实现这一点,您需要创建一个map-entries流,然后将它收集到一个< code>Map中。

我在我的示例中使用了 Map.entry,它在 Java 9 及更高版本中可用。如果你使用的是Java 8,你可以使用AbstractMap.SimpleEntry或其他类型的Pair类。

大概是这样的:

java prettyprint-override">Map<String, String> entityGroup = groups.stream()
    .flatMap(group -> group.getEntities().stream()
        .map(entity -> Map.entry(entity.getKey(), group.getKey())))
    .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));

 类似资料:
  • 问题内容: 我有一张地图清单。 列表中的值例如是 最后,我想要一个Map>,就像 如何在Java中实现这一目标。 代码: 现在,基于与我想要的相同ID,此genericList是该列表的输入并来自此列表 基本上,要根据ID将响应归类为String,将具有相同ID的响应分组在列表中,然后创建一个以ID为键并以列表为值的新映射。 问题答案: 您可以使用Java 8进行以下操作: 这将打印: 整数:1

  • 我在考虑用更现代的东西取代一些旧的比较器代码。 我知道Java 8的Comparator方法,所以上面的方法可以变成: 但是,我需要为每次比较写出和,这有点烦人。理想情况下,我只需输入一个列表或多个lambda。 比如: 下面是我得到的最接近的结果,其中一些注释部分指出了由于泛型不匹配而无效的内容。症结似乎在于我想传入多个

  • 情况:我有一个包含多个子和子子对象的大对象,其属性包含多个数据类型。出于我们的目的,该对象类似于以下内容: 我需要遍历这个对象并构建一个键列表来显示层次结构,因此列表最终如下所示: 我得到了这个函数,它确实循环遍历对象并吐出键,但不是分层的: 有人能告诉我怎么做吗?这里有一个jsfiddle供您使用:http://jsfiddle.net/tbyna/

  • 问题内容: 我有以下问题: 如何将以下代码片段转换为Java 8 lambda样式? 不知道,从以下内容开始: 问题答案: 您需要将自己的流放入列表: 有关其他信息,请访问文档 只是可以写成的另一种形式(因为类型将由编译器推断)

  • 毫无头绪,从以下入手:

  • 我有一张地图清单