有时候咱们会用到相同类型的多个对象组成的数据。
例如Student对象中有Id,name,address属性,它的两个实例s1和s2,其中s1的name属性有值wang,可是address属性为空
s2的name属性为空,address有值“北京”,咱们有这种需求,须要合并出来 name="wang",address="北京" ,若是id相同,咱们就认为是一个对象,这样的话咱们就须要重写它的equals方法和hashcode方法java
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>中的对象合并去重,具体代码为ide
/** * Created by wangtf on 2015/12/11. * * 对象属性合并 * 一、只合并提供了getter setter方法,而且只有一个参数的属性 * 二、只对setter属性中为 String ,Date,Integer类型的属性进行合并 */ @Service public class ObjectsMerge<T> { private T merge(T t1,T t2 ) { Method[] declaredMethods = t1.getClass().getDeclaredMethods(); List<Method> getterMethods = new ArrayList<Method>(); 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<T> mergeObjects(List<T> list){ Map<T,T> map= new HashMap<T,T>(); 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(); } }
搞定!
this