Java 树形工具类
大约 1 分钟
Java 树形工具类
Tree 接口
children(子集) 的 get、set 方法
import java.util.List;
public interface Tree<T> {
List<T> getChildren();
void setChildren(List<T> children);
}
TreeUtils
树形工具类
import java.util.List;
import java.util.stream.Collectors;
/**
* Tree 工具类
* @author sa@linkot.cn
*/
public class TreeUtils {
/**
* 将集合排列为树形集合
* @param list 集合对象
* @param keyFunc 获取 key 的函数,通常为 ::getId()
* @param pKeyFunc 获取父 key 的函数,通常为 ::getPid()
* @param rootValue 根节点的父 key
* @return 排列后的树形集合
* @param <T> 实现 Tree 接口的类
* @param <R> Key类型
* @author sa@linkot.cn
*/
public static <T extends Tree<T>, R> List<T> marshal(List<T> list, KeyFunc<T, R> keyFunc, KeyFunc<T, R> pKeyFunc, R rootValue){
return list.stream().filter(e->rootValue.equals(pKeyFunc.get(e)))
.peek(e->e.setChildren(marshal(list, keyFunc, pKeyFunc, keyFunc.get(e))))
.collect(Collectors.toList());
}
public interface KeyFunc<T, R>{
R get(T e);
}
}
使用例
排列树形集合
实现Tree接口
import java.util.List;
import lombok.Getter;
import lombok.Setter;
@Getter
@Setter
public class DictTreeVO extends Dict implements Tree<DictTreeVO> {
private List<DictTreeVO> children;
}
调用
- 转换查询结果 bean 为 TreeVO
- 将 TreeVOList 按照 id 为主键,pid 为父级id,0L 为根节点的父级id进行树形排列
public List<DictTreeVO> queryTree(String type) {
List<DictTreeVO> list = queryByType(type).stream().map(e-> ObjectMapper.map(e, DictTreeVO.class)).collect(
Collectors.toList());
return TreeUtils.marshal(list, DictTreeVO::getId, DictTreeVO::getPid, 0L);
}