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;
@Column(name = "parete_id")
private Long pareteId;
@Column(name = "site_id")
private Long siteId;
@Column(name = "sort")
private Integer sort;
@Transient
private List<SpcMemberRole> children;
}
递归构造树结构
public List<SpcMemberRole> listWithTree(Long siteId) {
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": []
}
]
}