java–list转树形结构
1. 双重循环
2. 递归
3. Stream()
1. 双重循环
@Override
public List<Address> getAddressTree1() {
// 获取数据库中的所有address数据
List<Address> list = this.baseMapper.getAddressTree();
// 返回的树形数据
List<Address> tree = new ArrayList<Address>();
// 第一次遍历
for (Address address : list) {
// 找到根节点,这里我的根节点的pid为0
if (address.getPid().equals("0")) {
tree.add(address);
}
// 定义list用于存储子节点
List<Address> children = new ArrayList<Address>();
// 再次遍历list,找到子节点
for (Address node : list) {
// 子节点的pid等于父节点的id
if (node.getPid().equals(address.getId())) {
children.add(node);
}
}
// 给父节点设置子节点
address.setChildren(children);
}
return tree;
}
2. 递归
@Override
public List<Address> getAddressTree2() {
// 获取数据库中的所有address数据
List<Address> list = this.baseMapper.getAddressTree();
// 返回的树形数据
List<Address> tree = new ArrayList<Address>();
// 第一次遍历
for (Address address : list) {
// 找到根节点,这里我的根节点的pid为0
if (address.getPid().equals("0")) {
tree.add(findChild(address, list));
}
}
return tree;
}
private Address findChild(Address address, List<Address> list) {
// 定义list用于存储子节点
List<Address> children = new ArrayList<Address>();
for (Address node : list) {
// 找到根节点,这里我的根节点的pid为0
if (node.getPid().equals(address.getId())) {
// 调用递归
children.add(findChild(node, list));
}
}
address.setChildren(children);
return address;
}
3. Stream()
@Override
public List<Address> getAddressTree() {
// 获取数据库中的所有address数据
List<Address> addresses = this.baseMapper.getAddressTree();
// 操作所有的address数据
// 通过Collectors.groupingBy(Address::getPid)方法对addresses按照Pid进行分组,也就是将pid相同的放在一起
Map<String, List<Address>> addressMap = addresses.stream().collect(Collectors.groupingBy(Address::getPid));
// 循环addresses,给它设置children属性
addresses.forEach(address -> {
address.setChildren(addressMap.get(address.getId()));
});
// 现在已经形成了多棵树,最后我们再通过filter()方法挑选出根节点的那颗树即可。 这里我的根节点的pid为0
List<Address> resultList = addresses.stream().filter(item -> item.getPid().equals("0"))
.collect(Collectors.toList());
return resultList;
}