1. 程式人生 > 其它 >java8 兩個同類的實體物件合併屬性

java8 兩個同類的實體物件合併屬性

技術標籤:javalambdalambdajava

今天讓我修改一塊功能,我真的很無語,唉。

二三十行,全部是這種

a.setPropertie(b.getPropertie());

兩個相同類的不同物件間賦值,我真的搞的心口有點悶,賦值的方式眼花繚亂不說,寫那麼多行給屬性賦值的程式碼,第一點是累人啊,第二是現在都java8了,我們可以更優雅的解決這個問題

參考文章java 複製非空物件屬性值

這裡主要使用到的是hutoolBean工具-BeanUtil,複製屬性方法 copyProperties

看一下原始碼

這裡是可以對某些屬性不進行賦值的,比如我們只需要空屬性賦值,非空屬性排除,保持原樣

思路就是我們只需要將空屬性的欄位名找出來就可以了,PropertyDescriptor 是位於java.beans包下的工具類,意為屬性描述器,這樣我們就可以獲取到屬性陣列,利用java8的stream方式,遍歷出所有非空屬性並以字串“,”分隔(因為最後還是需要字串陣列的,這裡使用“,”分隔,後面方便分割成陣列)

        BeanWrapper bw = new BeanWrapperImpl(user1);
        PropertyDescriptor[] pd = bw.getPropertyDescriptors();
        String emptyNames = Arrays.stream(pd).filter(f->ObjectUtil.isNotEmpty(bw.getPropertyValue(f.getName()))).map(FeatureDescriptor::getName).collect(Collectors.joining(","));
        BeanUtil.copyProperties(user2,user1,emptyNames.split(","));

就這些,平常這樣用的地方應該很少,但是真的有那種動輒幾十行同類兩個物件賦值的,建議還是封裝一下了。(ˉ▽ˉ;)...