合并两个不同类型对象的列表

时间:2019-01-15 07:27:12

标签: java algorithm merge

我有两个包含两种不同类型对象的列表,它们共享一些属性。让我们说“列出usersDb”和“列出usersLdap”。 它们共享一个属性-userId。我想将usersDb和usersLdap合并到另一种对象的一个​​列表中(使用一个列表中的一些数据和第二个对象中的一些数据)。重要的是列表的大小可能不同。然后,该数据也应该在最终列表中,但是列表中未出现的字段应重新发送为空。

2 个答案:

答案 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());