List与树互转

JavaScript版本请点击这里

辅助类

TreeConverterException.class

public class TreeConverterException extends RuntimeException {

	private static final long serialVersionUID = 1L;

	public TreeConverterException() {
		super();
	}

	public TreeConverterException(String message, Throwable cause, boolean enableSuppression,
			boolean writableStackTrace) {
		super(message, cause, enableSuppression, writableStackTrace);
	}

	public TreeConverterException(String message, Throwable cause) {
		super(message, cause);
	}

	public TreeConverterException(String message) {
		super(message);
	}

	public TreeConverterException(Throwable cause) {
		super(cause);
	}

}

TreeConverterId.class

import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Inherited;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Documented
@Inherited
@Target({ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
public @interface TreeConverterId {

}

TreeConverterParent.class

import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Inherited;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Documented
@Inherited
@Target({ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
public @interface TreeConverterParent {

}

TreeConverterChildren.class

import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Inherited;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Documented
@Inherited
@Target({ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
public @interface TreeConverterChildren {

}

TreeConverterLevel.class

import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Inherited;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

/**
 * 此注解不是必须的
 */
@Documented
@Inherited
@Target({ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
public @interface TreeConverterLevel {

}

List2TreeConverterBean.class

import java.util.List;

public interface List2TreeConverterBean<T> {

	Object getId(T t);
	
	Object getParentId(T t);
	
	List<T> getChildren(T t);
	
}

Tree2ListConverterBean.class

import java.util.List;

public interface Tree2ListConverterBean<T> {
	
	List<T> getChildren(T t);
	
	void nullChildren(T t);
	
	void setLevel(T t, int level);
}

LevelStrategy.class

public interface LevelStrategy<T> {

	/**
	 * 设置level策略
	 * @param level 程序生成的默认level
	 * @param t 单个元素对象
	 * @return level 从1开始
	 */
	Object getLevel(int level, T t);
}

核心类

TreeConverter.class

import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class TreeConverter {
	
	private TreeConverter() {}
	
	public static <T> List<T> list2Tree(List<T> list) {
		return list2Tree(list, new List2TreeConverterBean<T>() {
			
			private Field idField;
			
			private Field parentIdField;
			
			private Field childrenField;
			
			@Override
			public Object getId(T t) {
				if (this.idField == null) {
					Field[] fields = t.getClass().getDeclaredFields();
					TreeConverterId converterId = null;
					for (Field field : fields) {
						converterId = field.getAnnotation(TreeConverterId.class);
						if (converterId != null) {
							field.setAccessible(true);
							this.idField = field;
							break;
						}
					}
					if (this.idField == null) {
						throw new TreeConverterException(t.getClass().getTypeName() + "@TreeConverterId is not found");
					}
				}
				try {
					return this.idField.get(t);
				} catch (IllegalArgumentException | IllegalAccessException e) {
					throw new TreeConverterException(t.getClass().getTypeName() + "@TreeConverterId Reflect exception", e);
				}
			}

			@Override
			public Object getParentId(T t) {
				if (this.parentIdField == null) {
					Field[] fields = t.getClass().getDeclaredFields();
					TreeConverterParent converterParent = null;
					for (Field field : fields) {
						converterParent = field.getAnnotation(TreeConverterParent.class);
						if (converterParent != null) {
							field.setAccessible(true);
							this.parentIdField = field;
							break;
						}
					}
					if (this.parentIdField == null) {
						throw new TreeConverterException(t.getClass().getTypeName() + "@TreeConverterParent is not found");
					}
				}
				try {
					return this.parentIdField.get(t);
				} catch (IllegalArgumentException | IllegalAccessException e) {
					throw new TreeConverterException(t.getClass().getTypeName() + "@TreeConverterParent Reflect exception", e);
				}
			}

			@Override
			public List<T> getChildren(T t) {
				if (this.childrenField == null) {
					Field[] fields = t.getClass().getDeclaredFields();
					TreeConverterChildren converterChildren = null;
					for (Field field : fields) {
						converterChildren = field.getAnnotation(TreeConverterChildren.class);
						if (converterChildren != null) {
							field.setAccessible(true);
							this.childrenField = field;
							break;
						}
					}
					if (this.childrenField == null) {
						throw new TreeConverterException(t.getClass().getTypeName() + "@TreeConverterChildren is not found");
					}
				}
				try {
					@SuppressWarnings("unchecked")
					List<T> children = (List<T>) this.childrenField.get(t);
					if (children == null) {
						children = new ArrayList<>();
						this.childrenField.set(t, children);
					}
					return children;
				} catch (IllegalArgumentException | IllegalAccessException e) {
					throw new TreeConverterException(t.getClass().getTypeName() + "@TreeConverterChildren Reflect exception", e);
				}
			}

		});
	}
	
	public static List<Map<String, Object>> list2Tree(List<Map<String, Object>> list, String idName, String parentIdName) {
		return list2Tree(list, idName, parentIdName, "children");
	}

	public static List<Map<String, Object>> list2Tree(List<Map<String, Object>> list, final String idName, final String parentIdName, final String childrenName) {
		return list2Tree(list, new List2TreeConverterBean<Map<String, Object>>() {

			@Override
			public Object getId(Map<String, Object> t) {
				return t.get(idName);
			}

			@Override
			public Object getParentId(Map<String, Object> t) {
				return t.get(parentIdName);
			}

			@SuppressWarnings("unchecked")
			@Override
			public List<Map<String, Object>> getChildren(Map<String, Object> t) {
				List<Map<String, Object>> children = (List<Map<String, Object>>) t.get(childrenName);
				if (children == null) {
					children = new ArrayList<Map<String, Object>>();
					t.put(childrenName, children);
				}
				return children;
			}
			
		});
	}

	public static <T> List<T> list2Tree(List<T> list, List2TreeConverterBean<T> bean) {
		int len = list.size();
		if (len <= 1) {
			return list;
		}
		List<T> temp = new ArrayList<>();
		Map<Object, T> map = new HashMap<>(new Double(len / 0.75).intValue() + 1);
		for (T item : list) {
			map.put(bean.getId(item), item);
		}
		for (T item : list) {
			Object parentId = bean.getParentId(item);
			if (parentId == null) {
				temp.add(item);
				continue;
			}
			T t = map.get(parentId);
			if (t == null) {
				temp.add(item);
				continue;
			}
			bean.getChildren(t).add(item);
		}
		return temp;
	}

	/**
	 * 设置默认level level从1开始, 作用于@TreeConverterLevel注释的字段
	 * @param <T>
	 * @param tree
	 * @return
	 */
	public static <T> List<T> tree2List(List<T> tree) {
		return tree2List(tree, (LevelStrategy<T>) null);
	}
	
	/**
	 * 自定义level策略, 作用于@TreeConverterLevel注释的字段
	 * @param <T>
	 * @param tree
	 * @param levelStrategy
	 * @return
	 */
	public static <T> List<T> tree2List(List<T> tree, LevelStrategy<T> levelStrategy) {
		return tree2List(tree, new Tree2ListConverterBean<T>() {
			
			private Field childrenField;
			
			private Field levelField;
			
			private boolean hasLevel = true;

			@SuppressWarnings("unchecked")
			@Override
			public List<T> getChildren(T t) {
				if (this.childrenField == null) {
					Field[] fields = t.getClass().getDeclaredFields();
					TreeConverterChildren converterChildren = null;
					for (Field field : fields) {
						converterChildren = field.getAnnotation(TreeConverterChildren.class);
						if (converterChildren != null) {
							field.setAccessible(true);
							this.childrenField = field;
							break;
						}
					}
					if (this.childrenField == null) {
						throw new TreeConverterException(t.getClass().getTypeName() + "@TreeConverterChildren is not found");
					}
				}
				try {
					return (List<T>) this.childrenField.get(t);
				} catch (IllegalArgumentException | IllegalAccessException e) {
					throw new TreeConverterException(t.getClass().getTypeName() + "@TreeConverterChildren Reflect exception", e);
				}
			}

			@Override
			public void nullChildren(T t) {
				if (this.childrenField == null) {
					Field[] fields = t.getClass().getDeclaredFields();
					TreeConverterChildren converterChildren = null;
					for (Field field : fields) {
						converterChildren = field.getAnnotation(TreeConverterChildren.class);
						if (converterChildren != null) {
							field.setAccessible(true);
							this.childrenField = field;
							break;
						}
					}
					if (this.childrenField == null) {
						throw new TreeConverterException(t.getClass().getTypeName() + "@TreeConverterChildren is not found");
					}
				}
				
				try {
					this.childrenField.set(t, null);
				} catch (IllegalArgumentException | IllegalAccessException e) {
					throw new TreeConverterException(t.getClass().getTypeName() + "@TreeConverterChildren Reflect exception", e);
				}
			}

			@Override
			public void setLevel(T t, int level) {
				if (this.hasLevel && this.levelField == null) {
					Field[] fields = t.getClass().getDeclaredFields();
					TreeConverterLevel converterLevel = null;
					for (Field field : fields) {
						converterLevel = field.getAnnotation(TreeConverterLevel.class);
						if (converterLevel != null) {
							field.setAccessible(true);
							this.levelField = field;
							break;
						}
					}
					if (this.levelField == null) {
						this.hasLevel = false;
					}
				}
				if (this.levelField != null) {
					try {
						this.levelField.set(t, levelStrategy == null ? level : levelStrategy.getLevel(level, t));
					} catch (IllegalArgumentException | IllegalAccessException e) {
						throw new TreeConverterException(t.getClass().getTypeName() + "@TreeConverterLevel Reflect exception", e);
					}
				}
			}
			
		});
	}
	
	/**
	 * 忽略level
	 * @param tree
	 * @param childrenName
	 * @return
	 */
	public static List<Map<String, Object>> tree2List(List<Map<String, Object>> tree, String childrenName) {
		return tree2List(tree, childrenName, null);
	}
	
	/**
	 * 当levelName 为 null 或 空字符串时忽略level
	 * @param tree
	 * @param childrenName
	 * @param levelName
	 * @return
	 */
	public static List<Map<String, Object>> tree2List(List<Map<String, Object>> tree, String childrenName, String levelName) {
		return tree2List(tree, childrenName, levelName, null);
	}
	
	public static List<Map<String, Object>> tree2List(List<Map<String, Object>> tree, final String childrenName, final String levelName, LevelStrategy<Map<String, Object>> levelStrategy) {
		return tree2List(tree, new Tree2ListConverterBean<Map<String, Object>>() {

			@SuppressWarnings("unchecked")
			@Override
			public List<Map<String, Object>> getChildren(Map<String, Object> t) {
				return (List<Map<String, Object>>) t.get(childrenName);
			}

			@Override
			public void nullChildren(Map<String, Object> t) {
				t.remove(childrenName);
			}

			@Override
			public void setLevel(Map<String, Object> t, int level) {
				if (levelName == null || levelName.isEmpty()) {
					return;
				}
				t.put(levelName, levelStrategy == null ? level : levelStrategy.getLevel(level, t));
			}
			
		});
	}
	
	public static <T> List<T> tree2List(List<T> tree, Tree2ListConverterBean<T> bean) {
		List<T> list = new ArrayList<T>();
		if (tree.isEmpty()) {
			return list;
		}
		T t = null;
		int len = tree.size();
		for(int i = 0; i < len; i++) {
			t = tree.get(i);
			bean.setLevel(t, 1);
            list.add(t);
            pushChild(list, t, 2, bean);
        }
		return list;
	}
	
	private static <T> void pushChild(List<T> list, T t, int level, Tree2ListConverterBean<T> bean) {
		List<T> children = bean.getChildren(t);
		if (children == null ) {
			return;
		} else if (children.isEmpty()) {
			bean.nullChildren(t);
			return;
		}
		bean.nullChildren(t);
		T t2 = null;
		for (int i = 0, len = children.size(); i < len; i++) {
			t2 = children.get(i);
			bean.setLevel(t2, level);
            list.add(t2);
            pushChild(list, t2, level + 1, bean);
		}
	}

}

使用示例

实体类

DepartmentBO.class

import java.util.List;

public class DepartmentBO {

	@TreeConverterId
	private String id;
	
	@TreeConverterParent
	private String parent;
	
	private String orgcode;
	
	@TreeConverterLevel
	private Integer levelflg;
	
	@TreeConverterChildren
	private List<DepartmentBO> list;
	
	public DepartmentBO() {}
	
	public DepartmentBO(String id, String parent, String orgcode) {
		this.id = id;
		this.parent = parent;
		this.orgcode = orgcode;
	}

	public String getId() {
		return id;
	}

	public void setId(String id) {
		this.id = id;
	}

	public String getParent() {
		return parent;
	}

	public void setParent(String parent) {
		this.parent = parent;
	}

	public String getOrgcode() {
		return orgcode;
	}

	public void setOrgcode(String orgcode) {
		this.orgcode = orgcode;
	}

	public Integer getLevelflg() {
		return levelflg;
	}

	public void setLevelflg(Integer levelflg) {
		this.levelflg = levelflg;
	}

	public List<DepartmentBO> getList() {
		return list;
	}

	public void setList(List<DepartmentBO> list) {
		this.list = list;
	}

	@Override
	public String toString() {
		return "DepartmentBO [id=" + id + ", parent=" + parent + ", orgcode=" + orgcode + ", levelflg=" + levelflg
				+ ", list=" + list + "]";
	}
	
}

Department2BO.class

import java.util.List;

public class Department2BO {

	@TreeConverterId
	private int id;
	
	@TreeConverterParent
	private int parent;
	
	private String orgcode;
	
	@TreeConverterLevel
	private Integer levelflg;
	
	@TreeConverterChildren
	private List<DepartmentBO> list;
	
	public Department2BO() {}
	
	public Department2BO(int id, int parent, String orgcode) {
		this.id = id;
		this.parent = parent;
		this.orgcode = orgcode;
	}

	public int getId() {
		return id;
	}

	public void setId(int id) {
		this.id = id;
	}

	public int getParent() {
		return parent;
	}

	public void setParent(int parent) {
		this.parent = parent;
	}

	public String getOrgcode() {
		return orgcode;
	}

	public void setOrgcode(String orgcode) {
		this.orgcode = orgcode;
	}

	public Integer getLevelflg() {
		return levelflg;
	}

	public void setLevelflg(Integer levelflg) {
		this.levelflg = levelflg;
	}

	public List<DepartmentBO> getList() {
		return list;
	}

	public void setList(List<DepartmentBO> list) {
		this.list = list;
	}

	@Override
	public String toString() {
		return "Department2BO [id=" + id + ", parent=" + parent + ", orgcode=" + orgcode + ", levelflg=" + levelflg
				+ ", list=" + list + "]";
	}
	
}

测试类

TreeConverterTest.class

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class TreeConverterTest {

	public static void main(String[] args) {
		list2tree1();
		list2tree2();
		list2tree3();
		list2tree4();
		list2tree5();
		tree2list1();
		tree2list2();
		tree2list3();
		tree2list4();
		tree2list5();
	}

	public static void list2tree1 () {
		List<DepartmentBO> list = new ArrayList<>();
		list.add(new DepartmentBO("1001", "1002", "qq1001"));
		list.add(new DepartmentBO("1002", "0", "qq1002"));
		list.add(new DepartmentBO("1003", "0", "cc1003"));
		list.add(new DepartmentBO("1004", "1003", "cc1004"));
		list.add(new DepartmentBO("1005", "1004", "cc1005"));
		list.add(new DepartmentBO("1006", "1004", "cc1006"));
		System.out.println("----------list2tree1");
		System.out.println(list);
		list = TreeConverter.list2Tree(list);
		System.out.println(list);
	}
	
	public static void list2tree2 () {
		List<DepartmentBO> list = new ArrayList<>();
		list.add(new DepartmentBO("1001", "1002", "qq1001"));
		list.add(new DepartmentBO("1002", "0", "qq1002"));
		list.add(new DepartmentBO("1003", "0", "cc1003"));
		list.add(new DepartmentBO("1004", "1003", "cc1004"));
		list.add(new DepartmentBO("1005", "1004", "cc1005"));
		list.add(new DepartmentBO("1006", "1004", "cc1006"));
		System.out.println("---------list2tree2");
		System.out.println(list);
		list = TreeConverter.list2Tree(list, new List2TreeConverterBean<DepartmentBO>() {

			@Override
			public Object getId(DepartmentBO t) {
				return t.getId();
			}

			@Override
			public Object getParentId(DepartmentBO t) {
				return t.getParent();
			}

			@Override
			public List<DepartmentBO> getChildren(DepartmentBO t) {
				List<DepartmentBO> children = t.getList();
				if (children == null) {
					children = new ArrayList<DepartmentBO>();
					t.setList(children);
				}
				return children;
			}

		});
		System.out.println(list);
	}
	
	public static void list2tree3 () {
		List<Map<String, Object>> list = new ArrayList<>();
		Map<String, Object> map1 = new HashMap<String, Object>();
		map1.put("id", 1001);
		map1.put("parent", 1002);
		map1.put("name", "qqq1001");
		list.add(map1);
		Map<String, Object> map2 = new HashMap<String, Object>();
		map2.put("id", 1002);
		map2.put("parent", 0);
		map2.put("name", "qqq1002");
		list.add(map2);
		Map<String, Object> map3 = new HashMap<String, Object>();
		map3.put("id", 1003);
		map3.put("parent", 0);
		map3.put("name", "rhhsh1003");
		list.add(map3);
		Map<String, Object> map4 = new HashMap<String, Object>();
		map4.put("id", 1004);
		map4.put("parent", 1003);
		map4.put("name", "rhhsh1004");
		list.add(map4);
		Map<String, Object> map5 = new HashMap<String, Object>();
		map5.put("id", 1005);
		map5.put("parent", 1004);
		map5.put("name", "rhhsh1005");
		list.add(map5);
		Map<String, Object> map6 = new HashMap<String, Object>();
		map6.put("id", 1006);
		map6.put("parent", 1004);
		map6.put("name", "rhhsh1006");
		list.add(map6);
		System.out.println("---------list2tree3");
		System.out.println(list);
		list = TreeConverter.list2Tree(list, "id", "parent");
//		list = TreeConverter.list2Tree(list, "id", "parent", "children");
		System.out.println(list);
	}
	
	public static void list2tree4 () {
		List<Map<String, Object>> list = new ArrayList<>();
		Map<String, Object> map1 = new HashMap<String, Object>();
		map1.put("id", 1001);
		map1.put("parent", 1002);
		map1.put("name", "qqq1001");
		list.add(map1);
		Map<String, Object> map2 = new HashMap<String, Object>();
		map2.put("id", 1002);
		map2.put("parent", 0);
		map2.put("name", "qqq1002");
		list.add(map2);
		Map<String, Object> map3 = new HashMap<String, Object>();
		map3.put("id", 1003);
		map3.put("parent", 0);
		map3.put("name", "rhhsh1003");
		list.add(map3);
		Map<String, Object> map4 = new HashMap<String, Object>();
		map4.put("id", 1004);
		map4.put("parent", 1003);
		map4.put("name", "rhhsh1004");
		list.add(map4);
		Map<String, Object> map5 = new HashMap<String, Object>();
		map5.put("id", 1005);
		map5.put("parent", 1004);
		map5.put("name", "rhhsh1005");
		list.add(map5);
		Map<String, Object> map6 = new HashMap<String, Object>();
		map6.put("id", 1006);
		map6.put("parent", 1004);
		map6.put("name", "rhhsh1006");
		list.add(map6);
		System.out.println("---------list2tree4");
		System.out.println(list);
		list = TreeConverter.list2Tree(list, new List2TreeConverterBean<Map<String, Object>>() {

			@Override
			public Object getId(Map<String, Object> t) {
				return t.get("id");
			}

			@Override
			public Object getParentId(Map<String, Object> t) {
				return t.get("parent");
			}

			@Override
			public List<Map<String, Object>> getChildren(Map<String, Object> t) {
				@SuppressWarnings("unchecked")
				List<Map<String, Object>> children = (List<Map<String, Object>>)t.get("children");
				if (children == null) {
					children = new ArrayList<Map<String, Object>>();
					t.put("children", children);
				}
				return children;
			}

		});
		System.out.println(list);
		System.out.println();
	}
	
	public static void list2tree5 () {
		List<Department2BO> list = new ArrayList<>();
		list.add(new Department2BO(1001, 1002, "qq1001"));
		list.add(new Department2BO(1002, 0, "qq1002"));
		list.add(new Department2BO(1003, 0, "cc1003"));
		list.add(new Department2BO(1004, 1003, "cc1004"));
		list.add(new Department2BO(1005, 1004, "cc1005"));
		list.add(new Department2BO(1006, 1004, "cc1006"));
		System.out.println("---------list2tree5");
		System.out.println(list);
		list = TreeConverter.list2Tree(list);
		System.out.println(list);
		System.out.println();
		System.out.println();
	}
	
	private static void tree2list1() {
		List<DepartmentBO> list = new ArrayList<>();
		list.add(new DepartmentBO("1001", "1002", "qq1001"));
		list.add(new DepartmentBO("1002", "0", "qq1002"));
		list.add(new DepartmentBO("1003", "0", "cc1003"));
		list.add(new DepartmentBO("1004", "1003", "cc1004"));
		list.add(new DepartmentBO("1005", "1004", "cc1005"));
		list.add(new DepartmentBO("1006", "1004", "cc1006"));
		list = TreeConverter.list2Tree(list);
		System.out.println("---------tree2list1");
		System.out.println(list);
		list = TreeConverter.tree2List(list, new Tree2ListConverterBean<DepartmentBO>() {

			@Override
			public List<DepartmentBO> getChildren(DepartmentBO t) {
				return t.getList();
			}

			@Override
			public void nullChildren(DepartmentBO t) {
				t.setList(null);
			}

			@Override
			public void setLevel(DepartmentBO t, int level) {
				t.setLevelflg(level);
			}
		});
		System.out.println(list);
	}
	
	private static void tree2list2() {
		List<DepartmentBO> list = new ArrayList<>();
		list.add(new DepartmentBO("1001", "1002", "qq1001"));
		list.add(new DepartmentBO("1002", "0", "qq1002"));
		list.add(new DepartmentBO("1003", "0", "cc1003"));
		list.add(new DepartmentBO("1004", "1003", "cc1004"));
		list.add(new DepartmentBO("1005", "1004", "cc1005"));
		list.add(new DepartmentBO("1006", "1004", "cc1006"));
		list = TreeConverter.list2Tree(list);
		System.out.println("---------tree2list2");
		System.out.println(list);
		list = TreeConverter.tree2List(list);
		System.out.println(list);
	}
	
	private static void tree2list3() {
		List<DepartmentBO> list = new ArrayList<>();
		list.add(new DepartmentBO("1001", "1002", "qq1001"));
		list.add(new DepartmentBO("1002", "0", "qq1002"));
		list.add(new DepartmentBO("1003", "0", "cc1003"));
		list.add(new DepartmentBO("1004", "1003", "cc1004"));
		list.add(new DepartmentBO("1005", "1004", "cc1005"));
		list.add(new DepartmentBO("1006", "1004", "cc1006"));
		list = TreeConverter.list2Tree(list);
		System.out.println("---------tree2list3");
		System.out.println(list);
		list = TreeConverter.tree2List(list, new LevelStrategy<DepartmentBO>() {
			
			@Override
			public Object getLevel(int level, DepartmentBO t) {
				
				return level * 10;
			}
		});
		System.out.println(list);
	}
	
	private static void tree2list4() {
		List<Map<String, Object>> list = new ArrayList<>();
		Map<String, Object> map1 = new HashMap<String, Object>();
		map1.put("id", 1001);
		map1.put("parent", 1002);
		map1.put("name", "qqq1001");
		list.add(map1);
		Map<String, Object> map2 = new HashMap<String, Object>();
		map2.put("id", 1002);
		map2.put("parent", 0);
		map2.put("name", "qqq1002");
		list.add(map2);
		Map<String, Object> map3 = new HashMap<String, Object>();
		map3.put("id", 1003);
		map3.put("parent", 0);
		map3.put("name", "rhhsh1003");
		list.add(map3);
		Map<String, Object> map4 = new HashMap<String, Object>();
		map4.put("id", 1004);
		map4.put("parent", 1003);
		map4.put("name", "rhhsh1004");
		list.add(map4);
		Map<String, Object> map5 = new HashMap<String, Object>();
		map5.put("id", 1005);
		map5.put("parent", 1004);
		map5.put("name", "rhhsh1005");
		list.add(map5);
		Map<String, Object> map6 = new HashMap<String, Object>();
		map6.put("id", 1006);
		map6.put("parent", 1004);
		map6.put("name", "rhhsh1006");
		list.add(map6);
		list = TreeConverter.list2Tree(list, "id", "parent", "children");
		System.out.println("---------tree2list4");
		System.out.println(list);
//		list = TreeConverter.tree2List(list, "children");
//		list = TreeConverter.tree2List(list, "children", "level");
		list = TreeConverter.tree2List(list, "children", "level", new LevelStrategy<Map<String, Object>>() {
			
			@Override
			public Object getLevel(int level, Map<String, Object> t) {
				return "level" + level;
			}
		});
		System.out.println(list);
	}
	
	private static void tree2list5() {
		List<Map<String, Object>> list = new ArrayList<>();
		Map<String, Object> map1 = new HashMap<String, Object>();
		map1.put("id", 1001);
		map1.put("parent", 1002);
		map1.put("name", "qqq1001");
		list.add(map1);
		Map<String, Object> map2 = new HashMap<String, Object>();
		map2.put("id", 1002);
		map2.put("parent", 0);
		map2.put("name", "qqq1002");
		list.add(map2);
		Map<String, Object> map3 = new HashMap<String, Object>();
		map3.put("id", 1003);
		map3.put("parent", 0);
		map3.put("name", "rhhsh1003");
		list.add(map3);
		Map<String, Object> map4 = new HashMap<String, Object>();
		map4.put("id", 1004);
		map4.put("parent", 1003);
		map4.put("name", "rhhsh1004");
		list.add(map4);
		Map<String, Object> map5 = new HashMap<String, Object>();
		map5.put("id", 1005);
		map5.put("parent", 1004);
		map5.put("name", "rhhsh1005");
		list.add(map5);
		Map<String, Object> map6 = new HashMap<String, Object>();
		map6.put("id", 1006);
		map6.put("parent", 1004);
		map6.put("name", "rhhsh1006");
		list.add(map6);
		list = TreeConverter.list2Tree(list, "id", "parent", "children");
		System.out.println("-----------tree2list5");
		System.out.println(list);
		list = TreeConverter.tree2List(list, new Tree2ListConverterBean<Map<String, Object>>() {

			@SuppressWarnings("unchecked")
			@Override
			public List<Map<String, Object>> getChildren(Map<String, Object> t) {
				return (List<Map<String, Object>>) t.get("children");
			}

			@Override
			public void nullChildren(Map<String, Object> t) {
				t.remove("children");
			}

			@Override
			public void setLevel(Map<String, Object> t, int level) {
				//t.put("levelflg", level - 1);
				t.put("levelflg", "level" + level);
			}
		});
		System.out.println(list);
	}
}

打印结果

----------list2tree1
[DepartmentBO [id=1001, parent=1002, orgcode=qq1001, levelflg=null, list=null], DepartmentBO [id=1002, parent=0, orgcode=qq1002, levelflg=null, list=null], DepartmentBO [id=1003, parent=0, orgcode=cc1003, levelflg=null, list=null], DepartmentBO [id=1004, parent=1003, orgcode=cc1004, levelflg=null, list=null], DepartmentBO [id=1005, parent=1004, orgcode=cc1005, levelflg=null, list=null], DepartmentBO [id=1006, parent=1004, orgcode=cc1006, levelflg=null, list=null]]
[DepartmentBO [id=1002, parent=0, orgcode=qq1002, levelflg=null, list=[DepartmentBO [id=1001, parent=1002, orgcode=qq1001, levelflg=null, list=null]]], DepartmentBO [id=1003, parent=0, orgcode=cc1003, levelflg=null, list=[DepartmentBO [id=1004, parent=1003, orgcode=cc1004, levelflg=null, list=[DepartmentBO [id=1005, parent=1004, orgcode=cc1005, levelflg=null, list=null], DepartmentBO [id=1006, parent=1004, orgcode=cc1006, levelflg=null, list=null]]]]]]
---------list2tree2
[DepartmentBO [id=1001, parent=1002, orgcode=qq1001, levelflg=null, list=null], DepartmentBO [id=1002, parent=0, orgcode=qq1002, levelflg=null, list=null], DepartmentBO [id=1003, parent=0, orgcode=cc1003, levelflg=null, list=null], DepartmentBO [id=1004, parent=1003, orgcode=cc1004, levelflg=null, list=null], DepartmentBO [id=1005, parent=1004, orgcode=cc1005, levelflg=null, list=null], DepartmentBO [id=1006, parent=1004, orgcode=cc1006, levelflg=null, list=null]]
[DepartmentBO [id=1002, parent=0, orgcode=qq1002, levelflg=null, list=[DepartmentBO [id=1001, parent=1002, orgcode=qq1001, levelflg=null, list=null]]], DepartmentBO [id=1003, parent=0, orgcode=cc1003, levelflg=null, list=[DepartmentBO [id=1004, parent=1003, orgcode=cc1004, levelflg=null, list=[DepartmentBO [id=1005, parent=1004, orgcode=cc1005, levelflg=null, list=null], DepartmentBO [id=1006, parent=1004, orgcode=cc1006, levelflg=null, list=null]]]]]]
---------list2tree3
[{parent=1002, name=qqq1001, id=1001}, {parent=0, name=qqq1002, id=1002}, {parent=0, name=rhhsh1003, id=1003}, {parent=1003, name=rhhsh1004, id=1004}, {parent=1004, name=rhhsh1005, id=1005}, {parent=1004, name=rhhsh1006, id=1006}]
[{parent=0, children=[{parent=1002, name=qqq1001, id=1001}], name=qqq1002, id=1002}, {parent=0, children=[{parent=1003, children=[{parent=1004, name=rhhsh1005, id=1005}, {parent=1004, name=rhhsh1006, id=1006}], name=rhhsh1004, id=1004}], name=rhhsh1003, id=1003}]
---------list2tree4
[{parent=1002, name=qqq1001, id=1001}, {parent=0, name=qqq1002, id=1002}, {parent=0, name=rhhsh1003, id=1003}, {parent=1003, name=rhhsh1004, id=1004}, {parent=1004, name=rhhsh1005, id=1005}, {parent=1004, name=rhhsh1006, id=1006}]
[{parent=0, children=[{parent=1002, name=qqq1001, id=1001}], name=qqq1002, id=1002}, {parent=0, children=[{parent=1003, children=[{parent=1004, name=rhhsh1005, id=1005}, {parent=1004, name=rhhsh1006, id=1006}], name=rhhsh1004, id=1004}], name=rhhsh1003, id=1003}]

---------list2tree5
[Department2BO [id=1001, parent=1002, orgcode=qq1001, levelflg=null, list=null], Department2BO [id=1002, parent=0, orgcode=qq1002, levelflg=null, list=null], Department2BO [id=1003, parent=0, orgcode=cc1003, levelflg=null, list=null], Department2BO [id=1004, parent=1003, orgcode=cc1004, levelflg=null, list=null], Department2BO [id=1005, parent=1004, orgcode=cc1005, levelflg=null, list=null], Department2BO [id=1006, parent=1004, orgcode=cc1006, levelflg=null, list=null]]
[Department2BO [id=1002, parent=0, orgcode=qq1002, levelflg=null, list=[Department2BO [id=1001, parent=1002, orgcode=qq1001, levelflg=null, list=null]]], Department2BO [id=1003, parent=0, orgcode=cc1003, levelflg=null, list=[Department2BO [id=1004, parent=1003, orgcode=cc1004, levelflg=null, list=[Department2BO [id=1005, parent=1004, orgcode=cc1005, levelflg=null, list=null], Department2BO [id=1006, parent=1004, orgcode=cc1006, levelflg=null, list=null]]]]]]


---------tree2list1
[DepartmentBO [id=1002, parent=0, orgcode=qq1002, levelflg=null, list=[DepartmentBO [id=1001, parent=1002, orgcode=qq1001, levelflg=null, list=null]]], DepartmentBO [id=1003, parent=0, orgcode=cc1003, levelflg=null, list=[DepartmentBO [id=1004, parent=1003, orgcode=cc1004, levelflg=null, list=[DepartmentBO [id=1005, parent=1004, orgcode=cc1005, levelflg=null, list=null], DepartmentBO [id=1006, parent=1004, orgcode=cc1006, levelflg=null, list=null]]]]]]
[DepartmentBO [id=1002, parent=0, orgcode=qq1002, levelflg=1, list=null], DepartmentBO [id=1001, parent=1002, orgcode=qq1001, levelflg=2, list=null], DepartmentBO [id=1003, parent=0, orgcode=cc1003, levelflg=1, list=null], DepartmentBO [id=1004, parent=1003, orgcode=cc1004, levelflg=2, list=null], DepartmentBO [id=1005, parent=1004, orgcode=cc1005, levelflg=3, list=null], DepartmentBO [id=1006, parent=1004, orgcode=cc1006, levelflg=3, list=null]]
---------tree2list2
[DepartmentBO [id=1002, parent=0, orgcode=qq1002, levelflg=null, list=[DepartmentBO [id=1001, parent=1002, orgcode=qq1001, levelflg=null, list=null]]], DepartmentBO [id=1003, parent=0, orgcode=cc1003, levelflg=null, list=[DepartmentBO [id=1004, parent=1003, orgcode=cc1004, levelflg=null, list=[DepartmentBO [id=1005, parent=1004, orgcode=cc1005, levelflg=null, list=null], DepartmentBO [id=1006, parent=1004, orgcode=cc1006, levelflg=null, list=null]]]]]]
[DepartmentBO [id=1002, parent=0, orgcode=qq1002, levelflg=1, list=null], DepartmentBO [id=1001, parent=1002, orgcode=qq1001, levelflg=2, list=null], DepartmentBO [id=1003, parent=0, orgcode=cc1003, levelflg=1, list=null], DepartmentBO [id=1004, parent=1003, orgcode=cc1004, levelflg=2, list=null], DepartmentBO [id=1005, parent=1004, orgcode=cc1005, levelflg=3, list=null], DepartmentBO [id=1006, parent=1004, orgcode=cc1006, levelflg=3, list=null]]
---------tree2list3
[DepartmentBO [id=1002, parent=0, orgcode=qq1002, levelflg=null, list=[DepartmentBO [id=1001, parent=1002, orgcode=qq1001, levelflg=null, list=null]]], DepartmentBO [id=1003, parent=0, orgcode=cc1003, levelflg=null, list=[DepartmentBO [id=1004, parent=1003, orgcode=cc1004, levelflg=null, list=[DepartmentBO [id=1005, parent=1004, orgcode=cc1005, levelflg=null, list=null], DepartmentBO [id=1006, parent=1004, orgcode=cc1006, levelflg=null, list=null]]]]]]
[DepartmentBO [id=1002, parent=0, orgcode=qq1002, levelflg=10, list=null], DepartmentBO [id=1001, parent=1002, orgcode=qq1001, levelflg=20, list=null], DepartmentBO [id=1003, parent=0, orgcode=cc1003, levelflg=10, list=null], DepartmentBO [id=1004, parent=1003, orgcode=cc1004, levelflg=20, list=null], DepartmentBO [id=1005, parent=1004, orgcode=cc1005, levelflg=30, list=null], DepartmentBO [id=1006, parent=1004, orgcode=cc1006, levelflg=30, list=null]]
---------tree2list4
[{parent=0, children=[{parent=1002, name=qqq1001, id=1001}], name=qqq1002, id=1002}, {parent=0, children=[{parent=1003, children=[{parent=1004, name=rhhsh1005, id=1005}, {parent=1004, name=rhhsh1006, id=1006}], name=rhhsh1004, id=1004}], name=rhhsh1003, id=1003}]
[{parent=0, level=level1, name=qqq1002, id=1002}, {parent=1002, level=level2, name=qqq1001, id=1001}, {parent=0, level=level1, name=rhhsh1003, id=1003}, {parent=1003, level=level2, name=rhhsh1004, id=1004}, {parent=1004, level=level3, name=rhhsh1005, id=1005}, {parent=1004, level=level3, name=rhhsh1006, id=1006}]
-----------tree2list5
[{parent=0, children=[{parent=1002, name=qqq1001, id=1001}], name=qqq1002, id=1002}, {parent=0, children=[{parent=1003, children=[{parent=1004, name=rhhsh1005, id=1005}, {parent=1004, name=rhhsh1006, id=1006}], name=rhhsh1004, id=1004}], name=rhhsh1003, id=1003}]
[{parent=0, name=qqq1002, id=1002, levelflg=level1}, {parent=1002, name=qqq1001, id=1001, levelflg=level2}, {parent=0, name=rhhsh1003, id=1003, levelflg=level1}, {parent=1003, name=rhhsh1004, id=1004, levelflg=level2}, {parent=1004, name=rhhsh1005, id=1005, levelflg=level3}, {parent=1004, name=rhhsh1006, id=1006, levelflg=level3}]

注意
方法的返回值才是转换后的结果

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值