有些业务场景下需要获取当前节点的父节点用于显示整个路径,或者判断当前节点是否在某一层的节点下面,如果我们可以拿到所有的父节点,那么其余的操作就很简单了。
下面写一种获取当前节点所有父节点的方式,当然没用递归的方式实现,一般能不用递归的实现的我都不会用递归。递归实现的,下一篇文章会写下。
话不多说,代码如下:
#实体定义
@Data
class SysAreaVo {
private String areaCode;
private String areaName;
private String parentCode;
private List<SysAreaVo> children;
}
#模拟数据
public static List<SysAreaVo> getAll() {
List<SysAreaVo> list = new ArrayList<>();
SysAreaVo a1 = new SysAreaVo();
a1.setAreaCode("1");
a1.setParentCode("0");
a1.setAreaName("a1");
list.add(a1);
SysAreaVo b1 = new SysAreaVo();
b1.setAreaCode("2");
b1.setParentCode("0");
b1.setAreaName("b1");
list.add(b1);
SysAreaVo a11 = new SysAreaVo();
a11.setAreaCode("11");
a11.setParentCode("1");
a11.setAreaName("a11");
list.add(a11);
SysAreaVo a12 = new SysAreaVo();
a12.setAreaCode("12");
a12.setParentCode("1");
a12.setAreaName("a12");
list.add(a12);
SysAreaVo b11 = new SysAreaVo();
b11.setAreaCode("21");
b11.setParentCode("2");
b11.setAreaName("b21");
list.add(b11);
SysAreaVo a111 = new SysAreaVo();
a111.setAreaCode("111");
a111.setParentCode("11");
a111.setAreaName("a111");
list.add(a111);
return list;
}
#核心方法
public static List<SysAreaVo> getParents(String currentNodeId, List<SysAreaVo> all, boolean flag) {
List<SysAreaVo> result = new ArrayList<>();
if (all == null || all.isEmpty()) return result;
Map <String, List<SysAreaVo>> map = all.stream().collect(Collectors.groupingBy(SysAreaVo::getParentCode));
SysAreaVo current = all.stream().filter(f -> f.getAreaCode().equals(currentNodeId)).findFirst().get();
if (flag) result.add(current);
for (int i = 0; i < map.keySet().size(); i++) {
SysAreaVo finalCurrent = current;
List<SysAreaVo> list = all.stream().filter(f -> finalCurrent.getParentCode().equals(f.getAreaCode())).collect(Collectors.toList());
if (list.size() > 0) {
current = list.get(0);
result.add(current);
} else {
continue;
}
}
return result;
}
#测试
public static void main(String[] args) {
List<SysAreaVo> all = getAll();
List<SysAreaVo> parents = getParents("111", all, true);
System.out.println(parents);
String allNames = String.join("-->", parents.stream(). map (SysAreaVo::getAreaName).collect(Collectors.toList()));
System.out.println(allNames);
}
#测试结果:
[SysAreaVo(areaCode=111, areaName=a111, parentCode=11, children=null),
SysAreaVo(areaCode=11, areaName=a11, parentCode=1, children=null),
SysAreaVo(areaCode=1, areaName=a1, parentCode=0, children=null)]
a111-->a11-->a1
当然要想获取节点id的话,map取一下就可以。