public static void main(String[] args) {
List<InnerObject> tmp = new ArrayList<>();
tmp.add(new InnerObject(1, "xx"));
tmp.add(new InnerObject(2, "yy"));
Map<String, Demo> map = new HashMap<>();
map.put("xx", new Demo(tmp));
map.put("yy", new Demo(tmp));
List<InnerObject> origin = new ArrayList<>();
origin.add(new InnerObject(1, "xx"));
origin.add(new InnerObject(1, "dd"));
origin.add(new InnerObject(2, "yy"));
origin.add(new InnerObject(3, "zz"));
fusion(map.get("xx").getInner(), origin);
System.out.println(map);
}
public static void fusion(List<InnerObject> one, List<InnerObject> origin) {
for (InnerObject o : origin) {
if (!one.contains(o)) {
one.add(o);
}
}
}
运行结果如下:
{xx=Demo(inner=[InnerObject(id=1, name=xx), InnerObject(id=2, name=yy), InnerObject(id=1, name=dd), InnerObject(id=3, name=zz)]),
yy=Demo(inner=[InnerObject(id=1, name=xx), InnerObject(id=2, name=yy), InnerObject(id=1, name=dd), InnerObject(id=3, name=zz)])}
从结果来看,当map中有多个值,但只去其中一个值处理并调用fuson()方法的时候,执行完,map中的其他对象的value值都变成一样的了,全是融合后的结果。
问题应该出在fusion()方法中,既进行contains()判断,由往集合里面add对象。
解决:
1、修改fusion()方法
public static List<InnerObject> fusion(List<InnerObject> one, List<InnerObject> origin) {
List<InnerObject> tmp = new ArrayList<>(one); // 创建一个包含one内容的临时对象进行add操作并返回
for (InnerObject o : origin) {
if (!one.contains(o)) {
tmp.add(o);
}
}
return tmp;
}
2、修改main()方法
public static void main(String[] args) {
List<InnerObject> tmp = new ArrayList<>();
tmp.add(new InnerObject(1, "xx"));
tmp.add(new InnerObject(2, "yy"));
Map<String, Demo> map = new HashMap<>();
map.put("xx", new Demo(tmp));
map.put("yy", new Demo(tmp));
List<InnerObject> origin = new ArrayList<>();
origin.add(new InnerObject(1, "xx"));
origin.add(new InnerObject(1, "dd"));
origin.add(new InnerObject(2, "yy"));
origin.add(new InnerObject(3, "zz"));
Demo demo = map.get("xx");
demo.setInner(fusion(demo.getInner(), origin)); // 重置"xx"的value
System.out.println(map);
}
结果:
{xx=Demo(inner=[InnerObject(id=1, name=xx), InnerObject(id=2, name=yy), InnerObject(id=1, name=dd), InnerObject(id=3, name=zz)]),
yy=Demo(inner=[InnerObject(id=1, name=xx), InnerObject(id=2, name=yy)])}
现在只有key为“xx”的融合了,"yy"保持不变。