我有两个包含两种不同类型对象的列表,它们共享一些属性。让我们说“列出usersDb”和“列出usersLdap”。 它们共享一个属性-userId。我想将usersDb和usersLdap合并到另一种对象的一个列表中(使用一个列表中的一些数据和第二个对象中的一些数据)。重要的是列表的大小可能不同。然后,该数据也应该在最终列表中,但是列表中未出现的字段应重新发送为空。
答案 0 :(得分:1)
首先,将List
中的一个(假设为List<UserLdap>
)转换为由userId索引的Map<String,UserLdap>
(我假设它是{{1 }}。
现在,您可以遍历其他String
,对于每个元素,搜索List
是否包含匹配的元素。使用这些元素创建合并类型的实例,并将其添加到输出Map
中。
最后,您必须在转换为List
的{{1}}中搜索在另一个List
中没有对应元素的元素,然后将它们转换为合并类型,并将其添加到输出Map
中。为了使最后一步高效,可能需要创建一个List
中存在的所有userId的List
。
答案 1 :(得分:1)
可能看起来像这样(按用户ID映射列表,获取所有用户ID-或获取用户ID的交集,然后遍历所有用户ID,获取每个地图中的匹配值,创建第三个类型):
List<UserDb> listA = ...;
List<UserLdap> listB = ...;
Map<String, UserDb> a = listA.stream().collect(toMap(UserDb::getUserId, Function.identity());
Map<String, UserDb> b = listB.stream().collect(toMap(UserLdap::getUserId, Function.identity());
Set<String> allIds = new HashSet<>();
allIds.addAll(a.keySet());
allIds.addAll(b.keySet()); // Or retainAll if you want the intersection instead of the union
List<FinalType> = allIds.stream().map(id -> {
UserDb userDb = a.get(id);
UserLdap userLdap = b.get(id);
FinalType t = // Build this one from the 2 others. Be careful that either can be null
return t;
}).collect(toList());