数据流系列-1-返回前端数据技巧

版权声明:本文为博主原创文章,未经博主允许不得转载。 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);//优化结果
	 * 
	 */
	
}

三、总结

看代码的时候,多从自己角度考虑,要是我,我会怎么写?人家为什么这么写?想不通就多看,看不懂就实际写。

猜你喜欢

转载自blog.csdn.net/meiceatcsdn/article/details/88877146