返回给前端的时候,我以前一直都是直接用实体类entity直接返回的。但是到后面我越来越发现这样子很不方便:
- 比如这个实体类中有许多属性我不想返回给前端,那我只好写个null;
- 我要一次查询多张表,返回许多数据的话,就肯定只能多去封装一个大类,也就是VO类
其实这里的方法有几种,最普通的及时一个个set了:
以遍历集合为例:
①遍历出来后取出每个元素,一个个set后再添加到新的集合里
//普通类型
List<PhoneCategory> phoneCategoryList = phoneCategoryRepository.findAll();
//常规写法
List<PhoneCategoryVO> phoneCategoryVOList = new ArrayList<>();
for (PhoneCategory phoneCategory : phoneCategoryList) {
PhoneCategoryVO phoneCategoryVO = new PhoneCategoryVO();
phoneCategoryVO.setCategoryName(phoneCategory.getCategoryName());
phoneCategoryVO.setCategoryType(phoneCategory.getCategoryType());
phoneCategoryVOList.add(phoneCategoryVO);
}
②用Java8的lambda表达式:
List<PhoneCategoryVO> phoneCategoryVOList = phoneCategoryList.stream()
.map(e -> new PhoneCategoryVO(
e.getCategoryName(),
e.getCategoryType()
)).collect(Collectors.toList());
③使用commons-lang3或者直接org.springframework.beans. BeanUtils的copyProperties
方法:
List<PhoneInfoVO> phoneInfoVOList = new ArrayList<>();
for (PhoneInfo phoneInfo : phoneInfoList) {
PhoneInfoVO phoneInfoVO = new PhoneInfoVO();
//将phoneSpecs中与phoneSpecsVO属性相同的进行拷贝给VO
BeanUtils.copyProperties(phoneInfo,phoneInfoVO);
//如果还有不同进行手动赋值
phoneInfoVO.setTag(PhoneUtil.createTag(phoneInfo.getPhoneTag()));
phoneInfoVOList.add(phoneInfoVO);
}
注意如果实体类中有不想赋值的属性,可以使用copyProperties(Object source, Object target, String... ignoreProperties)
,后面加上忽略的名字;
上面的方法对应的lambda式为:
List<PhoneInfoVO> phoneInfoVOList = phoneInfoList.stream()
.map(e -> new PhoneInfoVO(
e.getPhoneId(),
e.getPhoneName(),
e.getPhonePrice()+".00",
e.getPhoneDescription(),
PhoneUtil.createTag(e.getPhoneTag()),
e.getPhoneIcon()
)).collect(Collectors.toList());
可以看出在这种情况下,lambda表达式要手动的赋值,而使用BeanUtils的copyProperties方法就可以简洁。不过如果说返回给前端的VO和实体类的属性并不一样的话,使用lambda表达式就更加方便了。
当然,我对于lambda表达式还不够熟练,这个就只能多练习了!