我试图将具有公共(public)字段的多个对象列表合并到另一个列表中。
例如:
List
ObjA :字符串id;字符串名称,字符串a;字符串 b;
ObjB :字符串id;字符串地址;字符串 x;
ObjC :字符串id;字符串电话;串 y;
ObjD :字符串id;字符串邮政编码;
现在我想以一种非常有效的方式将这些列表合并到 List< ObjZ> 中。
ObjZ:字符串id;字符串名称,字符串a;字符串 b;字符串地址;字符串 x;字符串电话;串 y;字符串邮政编码;
任何人都可以帮我为上面写一个有效的代码吗?
最佳答案
使用 Map 而不是 List,并使所有 Objs 实现一个接口(interface),该接口(interface)定义了您用作键的 getId()。然后对于列表 A-D 中的每个条目,从 Map 获取(并可能创建 ObjZ)并更新其详细信息。
你可以让它变得非常通用。 Java 伪代码:
interface ObjCopier {
String getId();
void copyToObjZ(ObjZ z);
}
例如
class ObjA implements ObjCopier {
...
String getId() { return id; }
void copyToObjZ(ObjZ z) {
z.setName(name);
z.setA(a);
...
}
}
然后是合并所有内容的最后一点:
public void mergeObj(Map<String, ObjZ> map, Collection<? extends ObjCopier> list) {
for (ObjCopier obj : list) {
ObjZ z = getOrCreateObjZFromMap(map, obj.getId());
obj.copyToObjZ(z);
}
}
然后针对您拥有的所有列表调用 mergeObj()。
如果您谈论的是一个非常大的数据集,并且各个 ObjA-ObjD 中的字段没有重叠,您可以考虑使用线程池,其中每个 mergeObj() 方法都在不同的线程中运行.您需要同步 getOrCreateObjZFromMap(),或在启动线程之前预先创建所有 ObjZ 实例。这可以大大加快该过程,但您的里程可能会有所不同,因此最好始终使用反射(reflect)您情况的数据进行测试。
关于java - 将具有公共(public)字段的不同对象的多个列表合并到另一个列表中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23063410/