将保存不同对象的两个不同列表组合到第三个列表中,将对象作为两个列表的交叉连接

Posted

技术标签:

【中文标题】将保存不同对象的两个不同列表组合到第三个列表中,将对象作为两个列表的交叉连接【英文标题】:Combining Two Different Lists Holding Different Objects in to Third List holding Object as Cross Join of Two Lists 【发布时间】:2022-01-21 21:43:50 【问题描述】:

我有对象列表。每个对象都包含一个 Long 列表和一个 JsonNode 列表。 我要做的是用 Object 创建第三个 List,其中每个 Object 是上述两个 List 之间交叉连接的结果。

例如

class MyClass
    List<Long> _listLong;
    List<JsonNode> _listJsonNode;

我有 MyClass 对象列表。我想要的是创建一个 MyClass 列表。

class MyClass2
    Long id;
    JsonNode jsonNode;

这样List&lt;MyClass2&gt; 保存List&lt;Long&gt;List&lt;JsonNode&gt; 交叉连接的结果。

我可以使用循环来做同样的事情。 有没有办法在 Java 中使用 Streams 来实现相同的目标?

【问题讨论】:

“交叉连接”实际上是指笛卡尔积?还是按照两个列表的顺序进行一对一的映射? @ernest_k - 是的,我的意思是 Cartesion 产品 Cross join two lists java 的重复? 【参考方案1】:

如果您从 MyClass 对象列表开始,则必须将其展平并为笛卡尔积使用两个嵌套流。

List<MyClass2> result = myClassList.stream().flatMap(
   mc -> mc.get_listLong()
                .stream()
                .flatMap(i -> mc.get_listJsonNode()
                                .stream()
                                .map(js -> new MyClass2(i, js))))
        .collect(Collectors.toList());

假设构造函数MyClass2(Long, JsonNode) 存在。内部 flatMap 正在创建所需的笛卡尔积,基本上是通过为每个 Long 元素迭代所有 JsonNode 元素。

【讨论】:

缺少的是这段代码,我试过了,但它不起作用 @GSK 你注意到关于构造函数MyClass2(Long, JsonNode) 的评论了吗?如果这不是问题,您遇到了什么错误? -谢谢你的好..

以上是关于将保存不同对象的两个不同列表组合到第三个列表中,将对象作为两个列表的交叉连接的主要内容,如果未能解决你的问题,请参考以下文章

将 2 个不同对象的列表合并为一个组合对象

将两个选项按钮与单个组合框链接,用于不同的行源[关闭]

列表框多值选择

python的两个不同类型的列表组合

组合不同的列表数据并在 Web 部件中显示

如何将不同大小的numpy数组列表保存到磁盘?