如何在java中结合两个不同的Map?

我遵循了许多这样的链接合并两个地图 ,但还无法解决问题。

我有两个地图List<Map> – 这个地图包含acc_num, parent_acc_num, crte_dt, rnwl_dt, userid等, 其他地图包含acc_numisActive (这是第一个地图的更精细化)。

我想创建/组合这两个地图并创建最终地图,其中包含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查询,我需要检查查询本身的方法

  1. 如果CreatedDate + 30天> Sysdate,则显示列为true —>在Trail中
  2. 如果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> maps = ...; if (Optional.ofNullable(map.get(1).get("ACC_NUM")).filter(acc_num -> acc_num.equals(map.get(0).get("ACC_NUM"))).isPresent()) { map.get(0).putAll(map.get(1)); } 

编辑

 final List> l1 = ...; final List> l2 = ...; final List> result = l1.stream() .map(map -> { final Map r = new HashMap<>(map); l2.stream() .filter(map2 -> Objects.equals(map.get("ACC_NUM"), map2.get("ACC_NUM"))) .findFirst() .map(map2 -> map2.get("IS_ACTIVE")) .ifPresent(is_active -> map.put("IS_ACTIVE", is_active)); return r; }) .collect(Collectors.toList()); 

这是一种方法:

 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 value = l2.stream() .filter(m -> m.containsValue(map.get("ACC_NUM"))) .findFirst().map(c -> c.get("IS_ACTIVE")); temp.put("IS_ACTIVE", value.get()); // insert the new entry map3.add(temp); // add the new map to the accumulator }); 

这基本上枚举了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}}