List Po 转换成 List Vo
在日常开发中,entity常常不满足前端字段信息需求,又避免在单个entity中添加表字段而造成冗余情况,这个时候我们就会常常使用到Vo来传递数据。
一、创建VO entity
@Data
public class UserVo extends User {
private List<Cases> casesList;
}
二、List Po 转换成 List Vo
1.循环遍历
代码如下(示例):
List<User> newUser = (List<User>) userService.selectUserByType(regionId, likeName, match);
// po -> vo
newUser = (List<User>) userService.selectUserByType(regionId, likeName, match);
List<UserVo> userVoList = new ArrayList<>();
for (User user : newUser) {
UserVo roleVo = new UserVo();
BeanUtils.copyProperties(user, roleVo);
roleVo.setCasesList(caseMapper.selectList(new QueryWrapper<Cases>().eq("user_id", user.getId()).eq("state",3).last("limit 0,3")));
userVoList.add(roleVo);
}
2.java8 stream
代码如下(示例):
List<User> newUser = (List<User>) userService.selectUserByType(regionId, likeName, match);
//供应方列表添加案例信息
// po -> vo
userVos = newUser.stream().map(user ->{
UserVo userVo = new UserVo();
BeanUtils.copyProperties(user, userVo);
userVo.setCasesList(caseMapper.selectList(new QueryWrapper<Cases>().eq("user_id", userVo.getId()).eq("state",3).last("limit 0,3")));
return userVo;
}).collect(Collectors.toList());
三、Po、Vo转换工具类
单个类直接的copy,可使用BeanUtils.copyProperties工具类。
如有Collection类型的场景进行互转,则需要自行实现。写了一个工具类方便使用
/**
* @author : kk
* @description 模型转换 Utils
* @date : 2021/05/28 15:52
*/
public class ModelConverterUtils {
/**
* 创建类的一个实例
*
* @param beanClass
* 类
*/
public static <T> T newInstance(Class<T> beanClass) {
try {
return beanClass.newInstance();
} catch (Throwable e) {
throw new RuntimeException(e);
}
}
/**
* 属性拷贝
* @param source 源对象
* @param target 目标对象
*/
public static void copyProperties(Object source, Object target){
if (source == null) {
return;
}
BeanUtils.copyProperties(source, target);
}
/**
* 对象转换
* @param source 源对象
* @param targetClass 目标对象
* @param <T> 目标对象class类型
* @return 返回新的目标对象
*/
public static <T> T convert(Object source, Class<T> targetClass) {
if(source == null ){
return null;
}
T target = newInstance(targetClass);
copyProperties(source, target);
return target;
}
/**
* 对象List转换
* @param sources 源对象
* @param targetClass 目标对象
* @param <T> 目标对象class类型
* @return 返回新的目标对象List
*/
public static <T> List<T> convert(Collection<?> sources, Class<T> targetClass){
if(sources == null ){
return null;
}
List<T> targets = Lists.newArrayList();
if (!CollectionUtils.isEmpty(sources)) {
targets = sources.stream().map(x -> convert(x, targetClass)).collect(Collectors.toList());
}
return targets;
}
}
三、引入依赖方式
1.spring-beans
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>5.1.6.RELEASE</version>
</dependency>
public class TestDemo {
public static void main(String[] args) {
TestDemoFrom testDemoFrom = new TestDemoFrom();
HashMap<String, String> map = Maps.newHashMap();
map.put("001","北京");
map.put("002","上海");
map.put("003","广州");
testDemoFrom.setCitys(map);
testDemoFrom.setFlag(true);
testDemoFrom.setGmtStart(new Date());
testDemoFrom.setName("诺言");
testDemoFrom.setAge(18);
testDemoFrom.setTypes(Lists.newArrayList("我爱","宝贝"));
System.out.printf(testDemoFrom.toString()+"\n");
//下面就可以开始转化了,就一行代码
TestDemoDTO testDemoDTO = new TestDemoDTO();
BeanUtils.copyProperties(testDemoFrom,testDemoDTO);
System.out.println(testDemoDTO.toString());
}
}
2.dozer
<dependency>
<groupId>net.sf.dozer</groupId>
<artifactId>dozer</artifactId>
<version>5.4.0</version>
</dependency>
public class TestDemoDozer {
@Test
public void test() {
DozerBeanMapper mapper = new DozerBeanMapper();
TestDemoFrom testDemoFrom = new TestDemoFrom();
HashMap<String, String> map = Maps.newHashMap();
map.put("001","北京");
map.put("002","上海");
map.put("003","广州");
testDemoFrom.setCitys(map);
testDemoFrom.setFlag(true);
testDemoFrom.setGmtStart(new Date());
testDemoFrom.setName("诺言");
testDemoFrom.setAge(18);
testDemoFrom.setTypes(Lists.newArrayList("我爱","宝贝"));
System.out.printf(testDemoFrom.toString()+"\n");
// 转换
TestDemoDTO convert = mapper.map(testDemoFrom,TestDemoDTO.class);
System.out.println(convert);
}
}