webflux 树形结构用例

218 阅读1分钟
public Mono<G<List<GatewayGroupTreeVO>>> getTree() {
    // 1 获取用户
    UserVO user = ContextUtils.getCurrentUser();
    String tenantId = user.getTenantId();

    // 2 获取租户下所有网关
    Mono<List<GatewayGroup>> groups = r2dbcEntityTemplate.select(query(where("tenant_id").is(tenantId)), GatewayGroup.class).collectList();
    return groups.flatMap(c -> Mono.just(Optional.of(c))).defaultIfEmpty(Optional.empty())
        .flatMap(optional->{
            if(!optional.isPresent()){
                return Mono.empty();
            }
            // 3 把结构调整成树形返回
            List<GatewayGroup> groupList = optional.get();
            List<GatewayGroupTreeVO> tempVoList = groupList.stream().map(groupDO->{
                GatewayGroupTreeVO groupVO = new GatewayGroupTreeVO();
                BeanUtils.copyProperties(groupDO, groupVO);
                return groupVO;
            }).collect(Collectors.toList());

            Map<Integer, List<GatewayGroupTreeVO>> voMap = tempVoList.stream().collect(Collectors.groupingBy(GatewayGroupTreeVO::getParentId));
            tempVoList.forEach(item->item.setNodes(voMap.get(item.getGroupId())));

            return Mono.just(G.success(voMap.get(0)));
        });
}