java中,有两个list,list和list,AB对象的属性略有不同,现在想把A中的属性复制到B中,我们可以通过fastJOSN的方式方便的实现。
然后,如果再要处理个性的字段的话,那还是得遍历的。 目前好像没有找到不遍历的办法。
不过这种快速的转换copy方式,对于字段多的对象的话,还是少写一段代码?
呵呵,也许是自我安慰。除非完全不用修改新list的属性的value。
不过fastJOSN的方式底层是否也遍历了一次呢? 这个目前没有实验,不得而知。
package com.hanshow.wise.base.operate.util;
import java.util.List;
import com.alibaba.fastjson.JSON;
/**
* 两个对象或集合同名属性赋值
*/
public class ObjectConversion {
/**
* 从List<A> copy到List<B>
* @param list List<B>
* @param clazz B
* @return List<B>
*/
public static <T> List<T> copy(List<?> list,Class<T> clazz){
String oldOb = JSON.toJSONString(list);
return JSON.parseArray(oldOb, clazz);
}
/**
* 从对象A copy到 对象B
* @param ob A
* @param clazz B.class
* @return B
*/
public static <T> T copy(Object ob,Class<T> clazz){
String oldOb = JSON.toJSONString(ob);
return JSON.parseObject(oldOb, clazz);
}
}
用的时候可以参考这样:
String oldOb = JSON.toJSONString(notifyAnnouncesList);
List<NotifyrNoread> notifyNoReadList = JSON.parseArray(oldOb, NotifyrNoread.class);
//这里还是特么的必须得遍历去设置个性的字段。
for (NotifyrNoread item : notifyNoReadList) {
item.setReceiveUserid(userId);
item.setCreateTime(new Date());
item.setHasRead(0);
}
确定不想循环,也可以用java8的特性 steam来进行操作新的List,比如可以改成这样去写(至于底层是不是还是循环?这个模目前不得而知):
String oldOb = JSON.toJSONString(notifyAnnouncesList);
List<NotifyrNoread> notifyNoReadList = JSON.parseArray(oldOb, NotifyrNoread.class);
//使用steam对List进行批量操作,表面上看起来不是遍历。
notifyNoReadList = notifyNoReadList.parallelStream().map(item->{
item.setReceiveUserid(userId);
item.setCreateTime(new Date());
item.setHasRead(0);
return item;
}).collect(Collectors.toList());