将保存不同对象的两个不同列表组合到第三个列表中,将对象作为两个列表的交叉连接
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<MyClass2>
保存List<Long>
和List<JsonNode>
交叉连接的结果。
我可以使用循环来做同样的事情。 有没有办法在 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)
的评论了吗?如果这不是问题,您遇到了什么错误?
-谢谢你的好..以上是关于将保存不同对象的两个不同列表组合到第三个列表中,将对象作为两个列表的交叉连接的主要内容,如果未能解决你的问题,请参考以下文章