为了让一个java类 在不同的类型都能在程序中调用,我们常常会将此类定义为泛型类,重要特点是:类的作用是通用的,仅此我们需要传入的类型不一样。
一个具体的实例是,当我们采用treeTable 显示页面的数据时,后台需要进行数据的重新整合,此时针对好多类都会进行创建一个产生treeTable 数据的类。那么我们这时最好的案方法就是封装一个通用的类,进行调用即可,传入你要整合数据的类型和整合的数据即可。
代码如下:
public class TreeTableUtils<T extends DataEntity> {
protected T info;
public T getInfo() {
return info;
}
public void setInfo(T info) {
this.info = info;
}
private List<T> resultNodes = new ArrayList<T>();//树形结构排序之后list内容
private List<T> nodes; //传入list参数
public TreeTableUtils(List<T> nodes, T info) {//通过构造函数初始化
this.nodes = nodes;
this.info = info;
}
/**
* 构建树形结构list
*
* @return 返回树形结构List列表
*/
public List<T> buildTree() {
for (T node : nodes) {
if (node.getParentId() == null || "".equals(node.getParentId())) {//通过循环一级节点 就可以通过递归获取二级以下节点
resultNodes.add(node);//添加一级节点
build(node);//递归获取二级、三级、。。。节点
}
}
return resultNodes;
}
/**
* 递归循环子节点
*
* @param node 当前节点
*/
private void build(T node) {
List<T> children = getChildren(node);
if (!children.isEmpty()) {//如果存在子节点
for (T child : children) {//将子节点遍历加入返回值中
resultNodes.add(child);
build(child);
}
}
}
/**
* @param node
* @return 返回
*/
private List<T> getChildren(T node) {
List<T> children = new ArrayList<T>();
String id = node.getId();
for (T child : nodes) {
if (id.equals(child.getParentId())) {//如果id等于父id
children.add(child);//将该节点加入循环列表中
}
}
return children;
}
}
其中涉及的知识点:递归和泛型