public class TreeUtil {
/**
* List转Tree
* @param source 源数据(List)
* @param resultList 结果数据(Tree)
* @param root 是顶级菜单的条件
* @param getIdFunction 获取id
* @param getPIdFunction 获取父id
* @param getChildFunction 获取子列表
* @param setChildFunction 设置子列表
* @param <T> 类型
* @return 结果数据(Tree)
*/
public static <T> List<T> list2Tree(List<T> source,List<T> resultList, Predicate<T> root, Function<T,?> getIdFunction, Function<T,?> getPIdFunction, Function<T,List<T>> getChildFunction, BiConsumer<T,List<T>> setChildFunction){
//<id,实体>
final Map<Object,T> map = new HashMap<>();
//遍历处理
source.forEach((it)->{
Optional.ofNullable(root).map(r -> {
if (r.test(it)){
resultList.add(it);
}
return it;
}).orElseGet(() -> {
Optional.ofNullable(getPIdFunction.apply(it)).orElseGet(() -> {
resultList.add(it);
return null;
});
return null;
});
map.put(getIdFunction.apply(it),it);
});
//遍历处理
source.forEach((it)->{
map.computeIfPresent(getPIdFunction.apply(it), (k, v)->{
Optional.ofNullable(getChildFunction.apply(v)).orElseGet(()->{
final List<T> list = new ArrayList<>();
setChildFunction.accept(v,list);
return list;
}).add(it);
return v;
});
});
return resultList;
}
/**
* Tree转List
* @param source 源数据(Tree)
* @param resultList 结果数据(List)
* @param getChildFunction 获取子列表
* @param setChildFunction 设置子列表
* @param <T> 类型
* @return 结果数据(List)
*/
public static <T> List<T> tree2List(List<T> source,List<T> resultList,Function<T,List<T>> getChildFunction,BiConsumer<T,List<T>> setChildFunction){
source.forEach((it) -> {
List<T> childList = getChildFunction.apply(it);
if (null != childList && 0 != childList.size()){
tree2List(childList,resultList,getChildFunction,setChildFunction);
}
setChildFunction.accept(it,null);
resultList.add(it);
});
return resultList;
}
/**
* 在树上获取分支
* @param source 源数据(Tree)
* @param resultList 结果数据(List)
* @param root 分支的条件
* @param <T> 类型
* @return 结果数据(List)
*/
public static <T> List<T> getBranchFromTree(List<T> source,List<T> resultList,Predicate<T> root,Function<T,List<T>> getChildFunction,BiConsumer<T,List<T>> setChildFunction){
if (null == source || 0 == source.size()){
return source;
}
source.forEach((it)->{
List<T> childList = getChildFunction.apply(it);
if (!root.test(it)){
getBranchFromTree(childList,resultList,root,getChildFunction,setChildFunction);
}else {
if (null != childList && 0 != childList.size()){
getBranchFromTree(childList,resultList,t -> { return true; },getChildFunction,setChildFunction);
}
setChildFunction.accept(it,null);
resultList.add(it);
}
});
return resultList;
}
}
TreeUtil
©著作权归作者所有,转载或内容合作请联系作者
- 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
- 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
- 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
推荐阅读更多精彩内容
- 前言 Google Play应用市场对于应用的targetSdkVersion有了更为严格的要求。从 2018 年...