借助Java函数式接口实现简单的列表转树通用方法,直接贴代码
1.定义 Person实体类
class Person{
private Long id;
private Long fatherId;
private String name;
private List<Person> sonList;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public Long getFatherId() {
return fatherId;
}
public void setFatherId(Long fatherId) {
this.fatherId = fatherId;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public List<Person> getSonList() {
return sonList;
}
public void setSonList(List<Person> sonList) {
this.sonList = sonList;
}
@Override
public String toString() {
return "Person{" +
"id=" + id +
", fatherId=" + fatherId +
", name='" + name + '\'' +
", sonList=" + sonList +
'}';
}
}
2. 定义Setter函数式接口
@FunctionalInterface
public interface Setter<T, P> {
void accept(T t, P p);
}
3. 实现列表转树方法
利用函数式接口接收参数,实现了方法的通用
/**
* @param allData 全部数据
* @param parentIdField 父级ID字段
* @param childField 孩子字段
* @param idField ID字段
* @param parentId 父级ID
* @return
* @param <T>
* @param <U>
*/
public <T, U> List<T> listToTree(List<T> allData, Function<T, U> parentIdField, Setter<T, List<T>> childField, Function<T, U> idField, U parentId) {
if (Objects.isNull(allData)) return null;
List<T> childrenList = allData.stream()
.filter(data -> Objects.equals(parentIdField.apply(data), parentId))
.collect(Collectors.toList());
if (Objects.nonNull(childrenList)) {
childrenList.forEach(children -> childField.accept(children, listToTree(allData, parentIdField, childField, idField, idField.apply(children))));
}
return childrenList;
}
4. 测试
@Test
public void test3() {
List<Person> personList = new ArrayList<>();
Person person = null;
for (int i = 0; i < 3; i++) {
if (i == 0) {
person = new Person();
person.setId(i + 1L);
person.setFatherId(Long.valueOf(i + ""));
person.setName(i + 1 + "号人物");
personList.add(person);
}else {
person = new Person();
person.setId(i + 1L);
person.setFatherId(1L);
person.setName(i + 1 + "号人物");
personList.add(person);
}
}
System.out.println(personList);
// 通过方法引用传递父级ID等字段
List<Person> persons = listToTree(personList,
Person::getFatherId,
Person::setSonList,
Person::getId,
0L);
System.out.println(JSONUtil.toJsonPrettyStr(persons));
}