【问题标题】:Build map from list by lambda通过 lambda 从列表构建地图
【发布时间】:2022-11-25 00:12:53
【问题描述】:

我有一个带有内部字段 List<Entity> entitiesGroup 模型

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

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

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

谢谢

【问题讨论】:

  • 你能分享你的模型吗

标签: java


【解决方案1】:

要使用流来执行此操作,您需要创建一个映射条目流,然后将其收集到 Map 中。

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

像这样:

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

【讨论】:

  • 顺便说一句,在 Java 9+ 中,您可以使用 Map.entry(...) - 而无需 new&lt;&gt;
  • @k314159 好点。我会把它添加到答案中。
【解决方案2】:

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

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

【讨论】:

  • 不过,这使用了与问题不同的数据模型。在这个问题中,A-class(对应于Group)将有一个key-property,它应该是地图的值。
猜你喜欢
  • 1970-01-01
  • 2022-10-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-09-27
  • 1970-01-01
  • 1970-01-01
  • 2015-09-27
相关资源
最近更新 更多