JDK8中Stream流的使用

韩_师兄 2020-12-11 12:13:34
问题如下:我有一个部门,部门里面分子部门,子部门里面有孙部门,....可能还有更多层

实体类:
//lombok插件
@Data
public class Dept {

//部门id
private Integer id;
//部门名称
private String deptName;

//子部门集合
private List<Dept> deptList;
}

问题1:通过一次查询.根据父部门id查询 ,把父部门的所有子部门,孙部门,...(可能有孙子部门等),全部查询出来?

问题2:查询出来的父部门,我想获取所有的部门id(父部门id,子部门id,孙部门id,....)放到一个List<Integer>集合中?
...全文
572 3 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
韩_师兄 2020-12-11
  • 打赏
  • 举报
回复
问题1: 查询出来时,不进行封装,使用stream流+递归完成封装. 问题2:直接使用stream流, List<Integer> collect1 = menus.stream().distinct().map(str -> str.getId()).collect(Collectors.toList());
qybao 2020-12-11
  • 打赏
  • 举报
回复
写个递归方法不就可以了吗?为啥要把问题复杂化
for example


public class Sample {
public static class Dept {
private Integer id;
private String deptName;
private List<Dept> deptList;
public Integer getId() {return id;}
public String getDeptName( ) {return deptName;}
public List<Dept> getDeptList() {return deptList;}
public void setId(Integer id) {this.id = id;}
public void setDeptName(String deptName) {this.deptName = deptName;}
public void setDeptList(List<Dept> deptList) {this.deptList = deptList;}
public String toString() {return String.format("id=%s, deptName=%s, deptList=[%s]", id, deptName, deptList);}
}

// 测试数据(一共3层,每层2个子部门)
public static Dept generateSampleDept(int id, int deep) {
Dept dept = new Dept();
dept.setId(id);
dept.setDeptName(String.format("部门%d", id));
dept.setDeptList(new ArrayList<>());
if (deep < 3) {
for (int i=1; i<3; i++) {
dept.getDeptList().add(generateSampleDept(id*10 + i, deep+1));
}
}
return dept;
}

// 查询部门
public static Dept searchDept(Dept dept, int id) {
Dept result = null;;
if (dept.getId().equals(id)) {
return dept;
}
for (Dept sub : dept.getDeptList()) {
result = searchDept(sub, id);
}
return result;
}

// 递归获取所有部门
public static List<Dept> getAllDept(Dept dept) {
List<Dept> list = new ArrayList<>();
list.add(dept);
for (Dept sub : dept.getDeptList()) {
list.addAll(getAllDept(sub));
}
return list;
}

public static void main(String[] args) {
try {
Dept dept = generateSampleDept(0, 0); //测试数据
System.out.println(dept); //打印所有部门

Dept father = searchDept(dept, 22); //查找父部门
if (father != null) {
List<Dept> allDept = getAllDept(father); //递归获得所有部门
System.out.printf("一共有%d个部门\n", allDept.size()); //确认一共有几个部门
for (Dept sub : allDept) {
System.out.println(sub);
}
List<Integer> allId = allDept.stream().map(e->e.getId()).collect(Collectors.toList()); //获得所有部门的id
System.out.println(allId);
}
} catch (Throwable e) {
e.printStackTrace();
}
}
}
韩_师兄 2020-12-11
  • 打赏
  • 举报
回复
@Test public void testtree(){ //模拟从数据库查询出来 List<Menu> menus = Arrays.asList( new Menu(1,"根节点",0), new Menu(2,"子节点1",1), new Menu(3,"子节点1.1",2), new Menu(4,"子节点1.2",2), new Menu(5,"根节点1.3",2), new Menu(6,"根节点2",1), new Menu(7,"根节点2.1",6), new Menu(8,"根节点2.2",6), new Menu(9,"根节点2.2.1",7), new Menu(10,"根节点2.2.2",7), new Menu(11,"根节点3",1), new Menu(12,"根节点3.1",11) ); System.out.println(JSON.toJSON(menus)); System.out.println("===================================="); //获取父节点 List<Menu> collect = menus.stream().filter(m -> m.getParentId() == 0).map( (m) -> { m.setChildList(getChildrens(m, menus)); return m; } ).collect(Collectors.toList()); System.out.println("-------转json输出结果-------"); System.out.println(JSON.toJSON(collect)); } /** * 递归查询子节点 * @param root 根节点 * @param all 所有节点 * @return 根节点信息 */ private List<Menu> getChildrens(Menu root, List<Menu> all) { List<Menu> children = all.stream().filter(m -> { return Objects.equals(m.getParentId(), root.getId()); }).map( (m) -> { m.setChildList(getChildrens(m, all)); return m; } ).collect(Collectors.toList()); return children; }

67,550

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧