如何在java中结合两个不同的Map?
我遵循了许多这样的链接合并两个地图 ,但还无法解决问题。
我有两个地图List<Map>
– 这个地图包含acc_num, parent_acc_num, crte_dt, rnwl_dt, userid
等, 其他地图包含acc_num
和isActive
(这是第一个地图的更精细化)。
我想创建/组合这两个地图并创建最终地图,其中包含acc_num, parent_acc_num, crte_dt, rnwl_dt, userid
+ isActive
详细信息。
我怎样才能做到这一点 ?
以下是示例数据。 唯一的问题是Map of Map,如何迭代一个到另一个?
{CRTE_DT=2017-06-22, USER_ID=ABC, ACC_NUM=9449, RNWL_DT=2017-06-22, PARENT_ACC_NO=9449} {ACC_NUM=9449, IS_ACTIVE=false}
另一个问题:如果下面的工作,那么可能不需要做计算
我使用12c进行下面的Oracle查询,我需要检查查询本身的方法
- 如果CreatedDate + 30天> Sysdate,则显示列为true —>在Trail中
- 如果CreatedDate + 30天 Out of Trail Period
“选择cust.acc_num,third.parent_acc_id,cust.crte_dt,cust.updated_dt,cust.crte_user_id来自CUST_ACCT cust,ThirdParty_third third”+“where cust.updated_dt为null且cust.CRTE_DT <sysdate”+“和cust.acc_num = third.third_code和is_actv =?union“+”从CUST_ACCT cust选择cust.acc_num,third.parent_acc_id,cust.crte_dt,cust.updated_dt,cust.crte_user_id,ThirdParty_third第三个“+”其中(cust.updated_dt不为null和cust .updated_dt <sysdate)“+”和cust.acc_num = third.third_code和is_actv =?“;
假设您的列表只包含两个映射,并且它们都是可变的。 当且仅当第二个映射的映射ACC_NUM
等于第一个映射时,您可以做的是将第二个映射的所有映射添加到第一个映射。
final List
编辑
final List
这是一种方法:
List> map3 = new ArrayList<>(); l1.forEach(map -> { // clone the map to avoid mutating existing maps Map temp = new HashMap<>(map); // get the corresponding match in the second list Optional
这基本上枚举了l1
(第一个列表)中的每个映射,并将整个映射克隆到一个新的映射实例中,只需在新映射中插入一个新条目,其中键是"IS_ACTIVE"
,值是我们在l2
找到的值(第二个清单)。
此解决方案假设在l2
始终存在相应的匹配,因此在Optional
结果上调用get()
。 但是,如果不是这种情况,那么您可以使用Optional#orElse
来提供默认值,或者如果找不到该值,您根本不想将该条目添加到地图中,请考虑使用Optional#isPresent
之前添加到地图。
此外,我建议通过Guide To Java 8 Optional来熟悉Optional API,当然还有java文档!
我会创建一个Map
来帮助解决问题。 "acct_num"
是两个地图共有的关键,因此您将使用它来匹配它们。
脚步:
- 迭代第一个列表,使用其acc_num作为键将每个元素添加到地图中。
- 迭代第二个列表,使用每个元素的acct_num值在地图中查找匹配元素,然后将第二个列表中的
"is_active"
对添加到您在map中找到的值。 - 从帮助器映射中获取
values()
,并且您有一个合并值的映射列表。
代码看起来像这样:
a = [CRTE_DT:"2017-06-22", USER_ID:"ABC", ACC_NUM:9449, RNWL_DT:"2017-06-22", PARENT_ACC_NO:9449] b = [ACC_NUM:9449, IS_ACTIVE:false] list1 = [a] list2 = [b] c = new HashMap>() for ( Map r : list1 ) { c.put(r.get("ACC_NUM"),r) } for (Map r : list2 ) { d = c.get(r.get("ACC_NUM")); if (d != null) d.putAll(r); } groovy:000> c ===> {9449={CRTE_DT=2017-06-22, USER_ID=ABC, ACC_NUM=9449, RNWL_DT=2017-06-22, PARENT_ACC_NO=9449, IS_ACTIVE=false}}