有时候我们会用到相同类型的多个对象组成的数据。
例如Student对象中有Id,name,address属性,它的两个实例s1和s2,其中s1的name属性有值wang,但是address属性为空s2的name属性为空,address有值“北京”,我们有这种需求,需要合并出来 name="wang",address="北京" ,如果id相同,我们就认为是一个对象,这样的话我们就需要重写它的equals方法和hashcode方法class Student{ private String id; private String name; private String address; public String getId() { return id; } public void setId(String id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getAddress() { return address; } public void setAddress(String address) { this.address = address; } @Override public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; Student student = (Student) o; if (!id.equals(student.id)) return false; return true; } @Override public int hashCode() { return id.hashCode(); }}
然后需要对list<Student>中的对象合并去重,具体代码为
/** * Created by wangtf on 2015/12/11. * * 对象属性合并 * 1、只合并提供了getter setter方法,并且只有一个参数的属性 * 2、只对setter属性中为 String ,Date,Integer类型的属性进行合并 */@Servicepublic class ObjectsMerge{ private T merge(T t1,T t2 ) { Method[] declaredMethods = t1.getClass().getDeclaredMethods(); List getterMethods = new ArrayList (); for(Method method:declaredMethods){ String name = method.getName(); if(name.startsWith("get")){ getterMethods.add(method); } } for(Method method:getterMethods){ try{ String methodName = method.getName(); Object sourceV = method.invoke(t1); if(sourceV==null || "".equals(sourceV.toString())){ Object targetV = method.invoke(t2); if(targetV!=null){ String setterMethodName = methodName.replace("get","set"); if(targetV instanceof String){ Method setterMethod = t1.getClass().getMethod(setterMethodName,String.class); setterMethod.invoke(t1,targetV); } if(targetV instanceof Date){ Method setterMethod = t1.getClass().getMethod(setterMethodName,Date.class); setterMethod.invoke(t1,targetV); } if(targetV instanceof Integer){ Method setterMethod = t1.getClass().getMethod(setterMethodName,Integer.class); setterMethod.invoke(t1,targetV); } } } }catch (Exception ex){ ex.printStackTrace(); } } return t1; } public Set mergeObjects(List list){ Map map= new HashMap (); for(T t:list){ T o = map.get(t); if(o!=null){ T merge = merge(o, t); map.put(merge,merge); }else{ map.put(t,t); } } return map.keySet(); }}
搞定!