有時候咱們會用到相同類型的多個對象組成的數據。
例如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