【问题标题】:Grouping By Issue In Java 8在 Java 8 中按问题分组
【发布时间】:2017-04-04 05:23:59
【问题描述】:

假设我有一个名为“父亲”的 java 类,它有一个儿子的列表属性(字符串)。很容易构建一个:Map<String, List<String>>,其中的键是所有父亲的名字,值是他所有的儿子。

我想知道如何逆向:Map<String, List<String>>,其中他们的键与每个儿子相关,值是他父亲的列表。考虑到一个儿子可能属于 1 或 2 个父亲(父亲和母亲)。

我有这个代码:

结果是:

我要寻找的结果是例如: 儿子:Maria - 父亲:[María Eugenia, Enrique Alberto] 儿子:Agustin - 父亲:[María Eugenia, Enrique Alberto]

【问题讨论】:

  • 将您的代码发布为文本,而不是图像。

标签: java-8 mapping collectors


【解决方案1】:

因此,解决此问题的一种方法是将其视为两步操作。第一步是构建 <Child, Parent> 对的流,然后使用 groupingBy 将该流缩减为 Map<Child,Parent>

static class Parent{
    String name;
    List<Child> sons;

    public Parent(final String name, final List<Child> sons) {
        this.name = name;
        this.sons = sons;
    }

    @Override
    public String toString() {
        return MoreObjects.toStringHelper(this)
                .add("name", name)
                .add("sons", sons)
                .toString();
    }
}

static class Child{
    public Child(final String name) {
        this.name = name;
    }

    String name;


    @Override
    public String toString() {
        return MoreObjects.toStringHelper(this)
                .add("name", name)
                .toString();
    }
}

static void SonsToFathers(){
    Child c1 = new Child("aa");
    Child c2 = new Child("bb");

    List<Parent> parents = ImmutableList.of(
            new Parent("P1", ImmutableList.of(c1)),
            new Parent("P2", ImmutableList.of(c1,c2)),
            new Parent("P3", ImmutableList.of(c2)));


    Map<Child,List<Parent>> childToParents = parents.stream()
            .flatMap(p -> p.sons.stream()
                    .collect(Collectors.toMap(Function.identity(), s -> p))
                    .entrySet()
                    .stream())
            .collect(Collectors.groupingBy(
                    Map.Entry::getKey, 
                    mapping(Map.Entry::getValue, toList())));


    System.out.println(childToParents);
}

【讨论】:

  • 基因泰勒!你摇滚!...感谢您的帮助...想深入了解 java 8 流...下次我将在文本中而不是在图像中发布代码...谢谢...我将对其进行更多分析现在...
  • 您不需要将子列表收集到地图中,只需获取Map.Entrys 的流即可。你可以简单地说.flatMap(p -&gt; p.sons.stream().map(s -&gt; new AbstractMap.SimpleImmutableEntry&lt;&gt;(s, p)))
  • 是的,因为我们只在这对(儿子,父母)之后。我决定使用中间图来清楚地说明转换是如何发生的。 (如果标准库中只有一个 Pair 这样我们就可以避免使用像 SimpleImmutableEntry 这样笨拙的结构)
  • 虽然 Java 9 仍然没有 pair/tuple 类型,但会有方便的 Map.entry(s, p) 替换 new AbstractMap.SimpleImmutableEntry&lt;&gt;(s, p)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-11
  • 1970-01-01
相关资源
最近更新 更多