版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/meiceatcsdn/article/details/88877146
1、背景
2、代码
3、总结
一、背景
各位小伙伴,晚上好。这里总结一个在返回前端数据中的技巧
结论:在封装的返回前端的DTO中,如果考虑到前端在给DTO一个属性赋值时候,每次都需要构造一个容器,那么可以在DTO中事先处理。
比如:DivisionDTO中有个属性List subDivisions,那么要返回DTO的时候,一般会这么做:
1、构造一个List<Object> lists
2、遍历一个容器,lists执行add
3、遍历结束为divisionDTO赋值subDivisions(lists)
改造后只需要:
在遍历过程中调用DTO的divisionDTO.addSubDivisions(districtDivision);//优化结果
改造方法:在DTO中增加一个方法,初始化容器并为容器赋值。详细过程请见代码DivisionDTO
核心部分就是DTO中增加的这个方法:
public void addSubDivisions(DivisionDTO divisionDTO) {
if(subDivisions == null) {
subDivisions = new ArrayList<>();
}else {
subDivisions.add(divisionDTO);
}
}
二、代码
RegionDTO
package com.hmc.actualExercise;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
/**
Author:meice Huang
Time:2019年3月28日下午5:28:31
*/
public class DivisionDTO implements Serializable{
private static final long serialVersionUID = 2322557149909118604L;
public static enum Level{
PROVINCE,CITY,DISTRICT
}
private String name;
private int code;
private Level level;
private int parentCode;
private List<DivisionDTO> subDivisions;
public DivisionDTO() {
}
public DivisionDTO(String name,int code,Level level) {
this.name = name;
this.code = code;
this.level = level;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getCode() {
return code;
}
public void setCode(int code) {
this.code = code;
}
public Level getLevel() {
return level;
}
public void setLevel(Level level) {
this.level = level;
}
public int getParentCode() {
return parentCode;
}
public void setParentCode(int parentCode) {
this.parentCode = parentCode;
}
public List<DivisionDTO> getSubDivisions() {
return subDivisions;
}
public void setSubDivisions(List<DivisionDTO> subDivisions) {
this.subDivisions = subDivisions;
}
//重点关注
public void addSubDivisions(DivisionDTO divisionDTO) {
if(subDivisions == null) {
subDivisions = new ArrayList<>();
}else {
subDivisions.add(divisionDTO);
}
}
}
Region
package com.hmc.actualExercise;
/**
Author:meice Huang
Time:2019年3月28日下午5:46:40
*/
//@Entity
//@Table(name="region")
public class Region {
//@Column(name = "place_name")
private String name;
//@Column(name = "place_code")
private int code;
//@Column(name = "parent_code")
private int parentCode;
//@Column(name = "level")
private int level;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getCode() {
return code;
}
public void setCode(int code) {
this.code = code;
}
public int getParentCode() {
return parentCode;
}
public void setParentCode(int parentCode) {
this.parentCode = parentCode;
}
public int getLevel() {
return level;
}
public void setLevel(int level) {
this.level = level;
}
}
RegionRepository
package com.hmc.actualExercise;
/**
Author:meice Huang
Time:2019年3月28日下午5:58:23
*/
import java.util.List;
public interface RegionRepository {
List<Region> regionOfCity(int provinceCode);
List<Region> regionOfDistrict(int cityCode);
}
TestDivisionDTO
package com.hmc.actualExercise;
import java.util.ArrayList;
import java.util.List;
import com.hmc.actualExercise.DivisionDTO.Level;
/**
Author:meice Huang
Time:2019年3月28日下午5:45:01
*/
public class TestDivisionDTO {
//@Autowired
private RegionRepository regionRepository;
public DivisionDTO getDivisionDTO(Region region) {
Level level = null;
int levelInt = region.getLevel();
switch(levelInt) {
case 1:
level = Level.PROVINCE;
break;
case 2:
level = Level.CITY;
break;
case 3:
level = Level.DISTRICT;
break;
default:
break;
}
DivisionDTO divisionDTO = new DivisionDTO(region.getName(), region.getCode(), level);
if(level == Level.PROVINCE) {
List<Region> cityList = regionRepository.regionOfCity(region.getCode());
List<DivisionDTO> subDivisions = new ArrayList<>();//可优化点
if(cityList != null) {
for(Region city : cityList) {
DivisionDTO cityDivision = fromRegionToDivisionDTO(city);
subDivisions.add(cityDivision);//可优化点
}
divisionDTO.setSubDivisions(subDivisions);
}
}else if(level == Level.CITY) {
List<Region> districtList = regionRepository.regionOfDistrict(region.getCode());
List<DivisionDTO> subDivisions = new ArrayList<>();//可优化点
if(districtList != null) {
for(Region district : districtList) {
DivisionDTO districtDivision = fromRegionToDivisionDTO(district);
subDivisions.add(districtDivision);//可优化点
}
divisionDTO.setSubDivisions(subDivisions);
}
}
return divisionDTO;
}
public DivisionDTO getDivisionDTOOptimize(Region region) {
//简化前面步骤,仅关注变化点
String name = "乔峰";
int code = 110000;
Level level = Level.CITY;
DivisionDTO divisionDTO = new DivisionDTO(name, code, level);
if(level == Level.CITY) {
List<Region> districtList = regionRepository.regionOfDistrict(region.getCode());
if(districtList != null) {
for(Region district: districtList) {
DivisionDTO districtDivision = fromRegionToDivisionDTO(district);
divisionDTO.addSubDivisions(districtDivision);//优化的地方
}
}
}
return divisionDTO;
}
public DivisionDTO fromRegionToDivisionDTO(Region region) {
return new DivisionDTO();
}
/**
* 结论:至少减少了4行代码,如果还有其他判断,减少代码数还不错。
* 在类似返回List<DivisionDTO>这种情况下,可以在返回类中做处理,避免每次调用方都需要:
* 1、构造一个List<Object> lists
* 2、lists执行add
* 3、为divisionDTO赋值lists.
*
* 简化为一个步骤:
* divisionDTO.addSubDivisions(districtDivision);//优化结果
*
*/
}
三、总结
看代码的时候,多从自己角度考虑,要是我,我会怎么写?人家为什么这么写?想不通就多看,看不懂就实际写。