//准备实体类
@Data
public class TreeEntity {
private String id;
private String pId;
private String name;
}
/**
* @Auther:
* @Date: 2020/06/08/ 21:35
* @Description:
*/
public class Demo15 {
public List<TreeEntity> init() {
List<TreeEntity> list = new ArrayList<>();
TreeEntity entity1 = new TreeEntity();
entity1.setId("1");
entity1.setPId(null);
entity1.setName("祖宗");
list.add(entity1);
TreeEntity entity2 = new TreeEntity();
entity2.setId("11");
entity2.setPId("1");
entity2.setName("爷爷");
list.add(entity2);
TreeEntity entity3 = new TreeEntity();
entity3.setId("111");
entity3.setPId("11");
entity3.setName("爸爸");
list.add(entity3);
TreeEntity entity4 = new TreeEntity();
entity4.setId("1111");
entity4.setPId("111");
entity4.setName("儿子");
list.add(entity4);
TreeEntity entity5 = new TreeEntity();
entity5.setId("11111");
entity5.setPId("1111");
entity5.setName("孙子");
list.add(entity5);
TreeEntity entity6 = new TreeEntity();
entity6.setId("111111");
entity6.setPId("11111");
entity6.setName("重孙子");
list.add(entity6);
TreeEntity entity7 = new TreeEntity();
entity7.setId("1111111");
entity7.setPId("111111");
entity7.setName("玄孙子");
list.add(entity7);
return list;
}
public List<TreeEntity> getChildsByPid(String pId) {//根据id 获取他所有的子节点,包括儿子,孙子....
List<TreeEntity> list = init();
//第一步将Pid为空的值过滤掉,因为接下来需要按照Pid进行分组,不允许null
List<TreeEntity> listForNotNullPid = list.stream().filter(t -> StringUtils.isNotBlank(t.getPId())).collect(Collectors.toList());
//按照Pid 进行分组
Map<String, List<TreeEntity>> mapForPid = listForNotNullPid.stream().collect(Collectors.groupingBy(TreeEntity::getPId));
//准备一个存放所有子节点的集合
List<TreeEntity> childs = new ArrayList<>();
searchALLChildByPid(pId, childs, mapForPid);
return childs;
}
public void searchALLChildByPid(String pId, List<TreeEntity> childs, Map<String, List<TreeEntity>> mapForPid) {
for (Map.Entry<String, List<TreeEntity>> entity : mapForPid.entrySet()) {//循环 这个按照pId分好组的map
if (pId.equals(entity.getKey())) {//如果Pid 和组的pid相等,说明这一组就是这个pId 的孩子
childs.addAll(entity.getValue());//收集起来
List<TreeEntity> value = entity.getValue();//获取该组的所有孩子实体
for (TreeEntity treeEntity : value) {//循环这一组的孩子,继续找他们的孩子
searchALLChildByPid(treeEntity.getId(), childs, mapForPid);
}
}
}
}
@Test
public void test() {
List<TreeEntity> childs = getChildsByPid("1");
for (TreeEntity child : childs) {
System.out.println(child);
}
}
}
测试结果:
再测试一个,将参数改为111,结果:
备注:1.该方法需要基于JAVA8 的一些方法,2.该方法只能返回入参pId的孩子们,不包括入参本身!