Lambda表达式递归构造树

Lambda表达式递归构造树

声明一个实体类,用于记录每个节点的信息

@Entity
@Table(name = "spc_member_role")
@Data
public class SpcMemberRole {
    /**
     * 主键
     */
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "id", nullable = false)
    private Long id;

    /**
     * 名称
     */
    @Column(name = "role")
    private String role;

    /**
     * 父类id
     */
    @Column(name = "parete_id")
    private Long pareteId;

    /**
     * 站点ID
     */
    @Column(name = "site_id")
    private Long siteId;
    
    /**
     * 节点排序序号
     */
    @Column(name = "sort")
    private Integer sort;

    @Transient
    private List<SpcMemberRole> children;
}

递归构造树结构

public List<SpcMemberRole> listWithTree(Long siteId) {
        // 查询出当前节点和关联当前节点parentId下所有分类
        List<SpcMemberRole> memberRoleList = Optional.ofNullable(this.findBySiteId(siteId)).orElse(Lists.newArrayList());

        return memberRoleList.stream()
                // 过滤出父级
                .filter(spcMemberRole -> spcMemberRole.getPareteId() == 0L)
                // 给父级设置子级
                .peek(spcMemberRole -> spcMemberRole.setChildren(this.listChildren(spcMemberRole, memberRoleList)))
                .sorted(Comparator.comparing(SpcMemberRole::getSort))
                .collect(Collectors.toList());
    }

private List<SpcMemberRole> listChildren(SpcMemberRole spcMemberRole, List<SpcMemberRole> list) {
        // 递归查找子分类
        return list.stream()
                .filter(item -> item.getPareteId().equals(spcMemberRole.getId()))
                .peek(item -> item.setChildren(this.listChildren(item, list)))
                .sorted(Comparator.comparing(SpcMemberRole::getSort))
                .collect(Collectors.toList());
    }

查询结果

  • 页面效果

页面效果

  • 返回数据结构
{
  "status": 0,
  "message": "操作成功",
  "data": [
    {
      "id": 52,
      "role": "全部",
      "pareteId": 0,
      "siteId": 55,
      "sort": 1,
      "children": [
        {
          "id": 62,
          "role": "分组测试",
          "pareteId": 52,
          "siteId": 55,
          "sort": -4,
          "children": [
            {
              "id": 186,
              "role": "孙分组",
              "pareteId": 62,
              "siteId": 55,
              "sort": 1,
              "children": []
            }
          ]
        },
        {
          "id": 63,
          "role": "test",
          "pareteId": 52,
          "siteId": 55,
          "sort": 0,
          "children": []
        },
        {
          "id": 183,
          "role": "test1",
          "pareteId": 52,
          "siteId": 55,
          "sort": 1,
          "children": []
        }
      ]
    },
    {
      "id": 53,
      "role": "黑名单",
      "status": 1,
      "pareteId": 0,
      "siteId": 55,
      "sort": 2,
      "children": []
    }
  ]
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值