树状结构的查询在JavaWeb项目开发是经常遇到的一类开发需求,这一问题我们是可以通过SQL语句的来解决,那有没有可以利用代码来解决那,今天,小编就来和大家分享一个利用Stream流来解决树状图的问题。
首先准备一下实体类ItemInfo类:
public class ItemInfo {
private int id;
private Integer code;
private Integer pcode;
private String value;
private List<ItemInfo> children;
//省略了getter和setter方法
}
准备数据如下:
final List<ItemInfo> list = new ArrayList<ItemInfo>();
list.add(new ItemInfo(1,0,null,"一"));
list.add(new ItemInfo(2,1,0,"1"));
list.add(new ItemInfo(3,2,1,"1.1"));
list.add(new ItemInfo(4,3,1,"1.2"));
list.add(new ItemInfo(5,4,0,"2"));
list.add(new ItemInfo(6,5,4,"2.2"));
首先,我们先通过Stream流的filter筛选出第一级的目录,然后通过map函数去不断地分类第一季目录下的子级目录,并实时设置children属性,如下图所示:
List<ItemInfo> result = list.stream().filter(item -> 0==item.getPcode()).map(item -> {
item.setChildren(getChildren(item, list));
return item;
}).collect(Collectors.toList());
在子级循环遍历的时候,我们可以通过利用上面的思路不断filter和map(递归思路),如下图所示:
public static List<ItemInfo> getChildren(ItemInfo root, List<ItemInfo> all){
List<ItemInfo> children = all.stream().filter(item -> item.getPcode()==root.getCode())
.map((item) -> {
item.setChildren(getChildren(item, all));
return item;
}).collect(Collectors.toList());
return children;
}
运行结果如下图所示:
通过上图我们发现result里的数据已经将内容进行了分类,并转化成了我们想要的数据,之后,我们传到前端页面的时候,我们就能够合理化展示该树状结构。
此处,只是简单的例子,并不能用到实际开发中,实际开发中还需要结合相关业务进行相应的调整实体类。
文章所用代码完整代码如下:
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;
public class StreamTreeTest {
public static void main(String[] args) {
final List<ItemInfo> list = new ArrayList<ItemInfo>();
list.add(new ItemInfo(1,1,0,"1"));
list.add(new ItemInfo(1,2,1,"1.1"));
list.add(new ItemInfo(1,3,1,"1.2"));
list.add(new ItemInfo(1,4,0,"2"));
list.add(new ItemInfo(1,5,4,"2.2"));
List<ItemInfo> result = list.stream().filter(item -> 0==item.getPcode()).map(item -> {
item.setChildren(getChildren(item, list));
return item;
}).collect(Collectors.toList());
//打印
result.stream().forEach(System.out::println);
}
public static List<ItemInfo> getChildren(ItemInfo root, List<ItemInfo> all){
List<ItemInfo> children = all.stream().filter(item -> item.getPcode()==root.getCode())
.map((item) -> {
item.setChildren(getChildren(item, all));
return item;
}).collect(Collectors.toList());
return children;
}
}
import java.util.List;
public class ItemInfo {
private int id;
private Integer code;
private Integer pcode;
private String value;
private List<ItemInfo> children;
public ItemInfo(){
super();
}
public ItemInfo(int id, Integer code, Integer pcode, String value) {
super();
this.id = id;
this.code = code;
this.pcode = pcode;
this.value = value;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public Integer getCode() {
return code;
}
public void setCode(Integer code) {
this.code = code;
}
public Integer getPcode() {
return pcode;
}
public void setPcode(Integer pcode) {
this.pcode = pcode;
}
public String getValue() {
return value;
}
public void setValue(String value) {
this.value = value;
}
public List<ItemInfo> getChildren() {
return children;
}
public void setChildren(List<ItemInfo> children) {
this.children = children;
}
@Override
public String toString() {
return "\r\nItemInfo{" +
"id=" + id +
", code=" + code +
", pcode=" + pcode +
", value='" + value + '\'' +
", children=" + children +
"}";
}
}