一、背景
当数据库分页查询返回的对象与接口要返回的对象类型不一致时,不可避免需要进行类型转换。
示例:数据库分页查询返回的对象是PageDTO,而接口返回的对象类型是PageVO。
- PageDTO
@Data
public class PageDTO<T> {
    /**
     * Current page.
     */
    private Integer page;
    /**
     * Current size.
     */
    private Integer size;
    /**
     * Total.
     */
    private Long total;
    /**
     * Page List
     */
    private List<T> list;
    /**
     * New page dto.
     */
    public PageDTO() {
        this.page = 1;
        this.size = 10;
        this.total = 0L;
        this.list = new ArrayList<>();
    }
}
- PageVO
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.util.List;
@Data
public class PageVO<T> {
    @ApiModelProperty("Current page.")
    private Integer page;
    @ApiModelProperty("Page size.")
    private Integer size;
    @ApiModelProperty("Page total.")
    private Long total;
    @ApiModelProperty("Data list.")
    private List<T> list;
}
现在需要进行把PageDTO < AlertRule > 转换为PageVO < ListAlertRuleVO >
二、实现
public static <S, T> PageVO<T> convert(PageDTO<S> pageDTO, Function<S, T> function) {
        PageVO<T> pageVO = new PageVO<>();
        pageVO.setSize(pageDTO.getSize());
        pageVO.setPage(pageDTO.getPage());
        pageVO.setTotal(pageDTO.getTotal());
        List<T> list = Lists.newArrayList();
        if (!CollectionUtils.isEmpty(pageDTO.getList())) {
            list = pageDTO.getList().stream().map(function).collect(Collectors.toList());
        }
        pageVO.setList(list);
        return pageVO;
    }
使用示例:
         PageDTO<AlertRule> pageList = this.alertRuleDAO.pageList(request.getName(), request.getPage(), request.getSize());
         
        if (CollectionUtils.isEmpty(pageList.getList())) {
            return PageUtil.emptyList(ListAlertRuleVO.class);
        }
        return PageUtil.convert(pageList, r -> {
            ListAlertRuleVO listAlertRuleVO = new ListAlertRuleVO();
            listAlertRuleVO.setId(r.getId());
            listAlertRuleVO.setName(r.getName());
            // 略
            return listAlertRuleVO;
        });
- pageList()方法实现概要
// Condition
Example<AlertRule> example = Example.of(alertRule, matching);
PageRequest pageRequest = PageRequest.of(page - 1, size, Sort.by(Sort.Direction.DESC, "id"));
// Pagination
PageDTO<AlertRule> pageDTO = new PageDTO<>();
        
// Query
Page<AlertRule> pageList = this.alertRuleRepository.findAll(example, pageRequest);
if (!pageList.isEmpty()) {
    pageDTO.setPage(page);
    pageDTO.setSize(size);
    pageDTO.setTotal(pageList.getTotalElements());
    pageDTO.setList(pageList.toList());
}
return pageDTO;
三、总结
这里封装了一个工具类PageUtil,结合java的泛型,使用函数式编程Function实现了类型的抽象与转换。




















