【java8 stream 集合转为树结构】

集合转为树结构

单表,数据有层级,通过parentId关联
先需要获取层级树类型的数据,但不想多次查询,需要减少查询sql次数
1.单表查询所有有效数据
2.逻辑层处理成树结构

    public List<CheckVo> fun(){
        List<CheckVo> result = new ArrayList<>();
        // 查询 所有有效的数据
        List<CheckPo> checkPoList = super.getBaseMapper().selectList(Wrappers.<CheckPo>lambdaQuery()
                .eq(CheckPo::getStatus, StatusEnum.VALID.getValue()));
        List<CheckVo> checkVoList = CheckBeanConvertUtil.INSTANCE.getCheckVo(checkPoList);
        if(CollUtil.isNotEmpty(checkVoList)){
            result = checkVoList.stream().filter(item->item.getParentId()==null)
                   .map(item->{
                       item.setChildren(getChildren(item,checkVoList));
                       return item;
                   }).collect(Collectors.toList());
        }
		return result;
	}
   // 递归方法
    private List<CheckVo> getChildren(CheckVo vo,List<CheckVo> checkVoList){
        return checkVoList.stream()
                .filter(item->item.getParentId()!=null && item.getParentId().equals(vo.getId()))
                .map(item->{
                    item.setChildren(getChildren(item,checkVoList));
                    return item;
                }).collect(Collectors.toList());
    }

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
生成树型结构通常可以使用递归算法,以下是一个示例代码: 假设我们有一个如下的路径字符串: ```java String path = "/a/b/c/d"; ``` 我们希望将其转换为如下的树型结构: ``` a └── b └── c └── d ``` 可以使用以下的代码实现: ```java import java.util.ArrayList; import java.util.List; public class TreeGenerator { public static void main(String[] args) { String path = "/a/b/c/d"; Node rootNode = generateTree(path); System.out.println(rootNode.toString()); } public static Node generateTree(String path) { String[] pathArray = path.split("/"); Node rootNode = new Node(pathArray[1]); Node currentNode = rootNode; for (int i = 2; i < pathArray.length; i++) { Node childNode = new Node(pathArray[i]); currentNode.addChild(childNode); currentNode = childNode; } return rootNode; } static class Node { private String name; private List<Node> children = new ArrayList<>(); public Node(String name) { this.name = name; } public void addChild(Node child) { children.add(child); } @Override public String toString() { return toString(0); } private String toString(int level) { StringBuilder sb = new StringBuilder(); for (int i = 0; i < level; i++) { sb.append(" "); } sb.append(name).append("\n"); for (Node child : children) { sb.append(child.toString(level + 1)); } return sb.toString(); } } } ``` 该代码会输出以下内容: ``` a b c d ``` 其中,`Node` 类表示树中的节点,`generateTree` 方法用于将路径字符串转化为树型结构,`toString` 方法用于将树型结构转化为字符串。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值