我有一個 Employee 類,它有一個帶有屬性的樹結構 team
public class Employee {
private String name;
private List<Employee> team;
}
使用 Java lambdas,我需要將此樹平展為同一級別串列,同時將 Employee 類轉換為以下 ConvertedEmployee,同時將名稱存盤在專用lead和subordinates屬性中。所以 ConvertedEmployee 在某種意義上是一個保持父子節點的節點。我需要有一個清單。
public class ConvertedEmployee {
private String name;
private String lead;
private List<String> subordinatesNames;
}
所以最終結果應該是 List<ConvertedEmployee>
我想在這里使用遞回。
但我只能把樹弄平,不能重建它的父母。
編輯:輸入是 Employee 物件的實體,里面基本上有一棵樹team
uj5u.com熱心網友回復:
使用流連接的非遞回解決方案,然后過濾掉沒有lead欄位集的“重復”條目:
public static List<ConvertedEmployee> convert(List<Employee> staff) {
return staff
.stream()
.flatMap(e -> Stream.concat(
// subordinates of current employee
e.getTeam()
.stream()
.map(sub -> new ConvertedEmployee(
sub.getName(), e.getName(),
sub.getTeam().stream().map(Employee::getName).collect(Collectors.toList())
)),
// current employee by themself
Stream.of(new ConvertedEmployee(
e.getName(), null,
e.getTeam().stream().map(Employee::getName).collect(Collectors.toList())
))
))
.collect(Collectors.collectingAndThen(
Collectors.toMap(
ConvertedEmployee::getName,
c -> c,
(e1, e2) -> e1.getLead() != null ? e1 : e2.getLead() != null ? e2 : e1,
LinkedHashMap::new
),
map -> new ArrayList<>(map.values())
));
}
測驗以下設定:
Employee intern = new Employee("intern", Collections.emptyList());
Employee junior = new Employee("junior", Collections.emptyList());
Employee middleDev = new Employee("mid", Arrays.asList(junior));
Employee devOps = new Employee("devOps", Collections.emptyList());
Employee teamLead = new Employee("teamLead", Arrays.asList(intern, middleDev));
Employee pm = new Employee("mgr", Arrays.asList(teamLead, devOps));
List<Employee> staff = Arrays.asList(intern, junior, middleDev, devOps, teamLead, pm);
convert(staff).forEach(System.out::println);
輸出:
ConvertedEmployee(name=intern, lead=teamLead, subordinatesNames=[])
ConvertedEmployee(name=junior, lead=mid, subordinatesNames=[])
ConvertedEmployee(name=mid, lead=teamLead, subordinatesNames=[junior])
ConvertedEmployee(name=devOps, lead=mgr, subordinatesNames=[])
ConvertedEmployee(name=teamLead, lead=mgr, subordinatesNames=[intern, mid])
ConvertedEmployee(name=mgr, lead=null, subordinatesNames=[teamLead, devOps])
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/326807.html
上一篇:查找嵌套物件中所有匹配鍵值的路徑
