根据 java中把一个list转tree的三种方法 整理了一个list转tree的工具类
一共三个类.两个是工具类(TreeNode.java
和TreeUtils.java
).一个是测试代码(TreeTest.java
).
实际业务场景中.可能需要修改TreeNode.java
类的getId
和getParentId
的方法返回类型,以及TreeUtils.java
类中的Map的key类型.这里假设树节点的id和parentId为Long
类型.
TreeNode.java
package com.demo.utils;
import java.util.List;
public interface TreeNode<T extends TreeNode<T>> {
Long getId();
Long getParentId();
void setChildren(List<T> children);
}
TreeUtils.java
package com.demo.utils;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
public class TreeUtils {
/**
* 根目录的 parentId
*/
private static final Long ROOT_ID = 0L;
public static <T extends TreeNode<T>> List<T> listToTree(List<T> list) {
Map<Long, List<T>> map = list.stream().collect(Collectors.groupingBy(T::getParentId));
list.forEach(node -> node.setChildren(map.get(node.getId())));
return list.stream().filter(v -> v.getParentId().equals(ROOT_ID)).collect(Collectors.toList());
}
}
测试类
package com.demo.utils;
import cn.hutool.json.JSONUtil;
import lombok.Data;
import java.util.ArrayList;
import java.util.List;
public class TreeTest {
public static void main(String[] args) {
List<Zone> zoneList = new ArrayList<>();
zoneList.add(new Zone(1L, 0L, "上海"));
zoneList.add(new Zone(2L, 0L, "北京"));
zoneList.add(new Zone(3L, 0L, "河南"));
zoneList.add(new Zone(31L, 3L, "郑州"));
zoneList.add(new Zone(32L, 3L, "洛阳"));
zoneList.add(new Zone(321L, 32L, "洛龙"));
zoneList.add(new Zone(11L, 1L, "松江"));
zoneList.add(new Zone(111L, 11L, "泗泾"));
// list转tree
List<Zone> zoneTree = TreeUtils.listToTree(zoneList);
System.out.println(JSONUtil.toJsonStr(zoneTree));
}
@Data
static class Zone implements TreeNode<Zone> {
private Long id;
private Long parentId;
private String name;
private List<Zone> children;
public Zone(Long id, Long parentId, String name) {
this.id = id;
this.parentId = parentId;
this.name = name;
}
}
}