【问题标题】:SQL joining like grouping ListSQL加入喜欢分组列表
【发布时间】:2020-02-02 07:31:35
【问题描述】:

如果表示相同的给定字段相等,我有几个列表要分组,我想知道是否有办法在 lambdas 或流中做

假设我们有一个包含容器信息的列表

container1-> containerInfo
container2-> containerInfo

然后我们有另一个列表,表示容器中的元素和容器名称

element1 -> container1 + elementInfo
element2 -> container1 + elementInfo
element3 -> container2 + elementInfo
element4 -> container2 + elementInfo

有一种方法可以通过组件加入两个列表,条件是它们都是不同的类,而且我需要两个列表中的某些信息,最后我想要这样的东西

Map<Integer,List<ContainetElementMap>> map;

例如:

{containerId, {containerName,elements,extraInfo}}
{containerId, {containerName,elements,extraInfo}}

我知道有一个 groupBy 这可能会有所帮助,但它只有在两个对象是相同类型的情况下才有效,我需要像 sql 在表之间进行连接时这样的东西

【问题讨论】:

  • 您现有的课程是什么样的?你用groupingBy做了什么?

标签: java lambda java-8


【解决方案1】:

试试这个方法。我使用 set 而不是 list 和其他点,您需要从地图中过滤掉没有元素的值:

Map<Integer, Set<Elem>> m = containers.stream()
            .collect(
                    Collectors.groupingBy(
                        Container::getId,
                        Collectors.flatMapping(
                                container -> elems.stream().filter(elem -> elem.containerId == container.id),
                                Collectors.toSet())
                 )
    );

这是容器类:

class Container {
    Integer id;

    public Container(Integer id) {
        this.id = id;
    }

    public Integer getId() {
        return id;
    }
}

和元素:

class Elem {
    Integer id;
    Integer containerId;
    String name;

    public Elem(Integer id, Integer containerId, String name) {
        this.id = id;
        this.containerId = containerId;
        this.name = name;
    }
 }

【讨论】:

  • 我按照你提到的那样实现了,我认为 Collectors.flatMapping 方法不存在,我更改了映射但抛出了一个错误,它返回给我一个 Integer、Set 而不是 Integer 的地图,Set,你知道如何解决这个问题吗?
  • @jam,抱歉忘了说我用的是 Java 9,这是 Collectors 中的新方法。
  • 在 java 8 中有没有办法做到这一点?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-09-07
  • 2019-02-04
  • 1970-01-01
  • 2017-03-21
  • 2021-12-06
  • 1970-01-01
  • 2020-11-23
相关资源
最近更新 更多