import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.function.BiConsumer;
import java.util.function.Function;
import java.util.stream.Collectors;
/**
* 功能描述:
* 该类用于构建树形结构,基于给定的数据列表,将父子节点关系组织成层级化的树形结构。
* 通过使用 Java 8 新特性,如 Function 和 BiConsumer,灵活地处理节点间的父子关系。
* -
* 创建人: 季冠臣
* 创建时间: 2024/12/2 15:38
*/
public class TreeStructureTest {
// 模拟的节点类
static class TradeInfo {
private String tradeID; // 当前节点ID
private String parentID; // 父节点ID
private List<TradeInfo> children; // 子节点列表
public TradeInfo(String tradeID, String parentID) {
this.tradeID = tradeID;
this.parentID = parentID;
this.children = new ArrayList<>();
}
// Getter 和 Setter 方法
public String getTradeID() {
return tradeID;
}
public void setTradeID(String tradeID) {
this.tradeID = tradeID;
}
public String getParentID() {
return parentID;
}
public void setParentID(String parentID) {
this.parentID = parentID;
}
public List<TradeInfo> getChildren() {
return children;
}
public void setChildren(List<TradeInfo> children) {
this.children = children;
}
@Override
public String toString() {
return "TradeInfo{" +
"tradeID='" + tradeID + '\'' +
", parentID='" + parentID + '\'' +
", children=" + children +
'}';
}
}
// 构建树形结构
private static <T, R> List<T> buildTree(List<T> dataList, BiConsumer<T, List<T>> setChildF, Function<T, R> getIdF,
Function<T, R> getParentIdF, R rootParentId) {
if (dataList != null && !dataList.isEmpty()) {
setChildCall(dataList, setChildF, getIdF, getParentIdF, rootParentId);
dataList = dataList.stream()
.filter(t -> (rootParentId != null && rootParentId.equals(getParentIdF.apply(t)))
|| (rootParentId == null && getParentIdF.apply(t) == null))
.collect(Collectors.toList());
}
return dataList;
}
// 将子集放入父级
private static <T, R> List<T> setChildCall(List<T> dataList, BiConsumer<T, List<T>> setChildF, Function<T, R> getIdF,
Function<T, R> getParentIdF, R parentId) {
if (dataList == null || dataList.isEmpty()) {
return dataList;
}
List<T> parentChild = dataList.stream()
.filter(t -> parentId == null || (getParentIdF.apply(t) != null && getParentIdF.apply(t).equals(parentId)))
.collect(Collectors.toList());
for (T t : parentChild) {
setChildF.accept(t, setChildCall(dataList, setChildF, getIdF, getParentIdF, getIdF.apply(t)));
}
return parentChild;
}
public static void main(String[] args) {
// 创建示例数据
List<TradeInfo> dataList = Arrays.asList(
new TradeInfo("1", null),
new TradeInfo("2", "1"),
new TradeInfo("3", "1"),
new TradeInfo("4", "2"),
new TradeInfo("5", "2")
);
// 定义如何获取ID和父ID
Function<TradeInfo, String> getIdF = TradeInfo::getTradeID;
Function<TradeInfo, String> getParentIdF = TradeInfo::getParentID;
// 定义如何设置子节点
BiConsumer<TradeInfo, List<TradeInfo>> setChildF = TradeInfo::setChildren;
// 构建树结构
List<TradeInfo> tree = buildTree(dataList, setChildF, getIdF, getParentIdF, null);
// 输出结果
System.out.println("构建后的树形结构:");
tree.forEach(System.out::println);
}
}