使用Java Stream API获取子部门的所有父级部门
在数据库表中,经常会有包含层次结构的部门信息表。本博客将使用Java语言和Stream API演示如何获取给定子部门的所有父级部门,并在代码中加入详细注释。
1. 创建 Department 类
首先,我们需要定义一个类来表示部门信息。Department
类包含三个属性:id
、name
和parentId
,分别表示部门的唯一标识、名称和父级部门的标识。
public class Department {
private long id;
private String name;
private long parentId;
// 构造函数
public Department(long id, String name, long parentId) {
this.id = id;
this.name = name;
this.parentId = parentId;
}
// Getter和Setter方法省略
}
2. 编写 DepartmentUtils 类
接下来,我们创建一个DepartmentUtils
类,其中包含一个静态方法getParentDepartments
,该方法使用递归调用来获取给定子部门的所有父级部门。注释将详细解释每个关键步骤。
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
import java.util.Optional;
import java.util.stream.Collectors;
import java.util.stream.Stream;
public class DepartmentUtils {
/**
* 获取给定子部门的所有父级部门
*
* @param allDepartments 包含所有部门信息的列表
* @param childDepartmentId 给定子部门的ID
* @return 包含所有父级部门的列表
*/
public static List<Department> getParentDepartments(List<Department> allDepartments, long childDepartmentId) {
// 使用递归调用获取所有父级部门
return getParentDepartmentsRecursively(allDepartments, childDepartmentId)
.stream()
.filter(Objects::nonNull)
.collect(Collectors.toList());
}
/**
* 递归方法:获取给定子部门的所有父级部门
*
* @param allDepartments 包含所有部门信息的列表
* @param childDepartmentId 给定子部门的ID
* @return 包含所有父级部门的列表
*/
private static List<Department> getParentDepartmentsRecursively(List<Department> allDepartments, long childDepartmentId) {
// 查找给定ID的子部门
Optional<Department> childDepartment = allDepartments.stream()
.filter(d -> d.getId() == childDepartmentId)
.findFirst();
if (childDepartment.isPresent()) {
// 查找子部门的父部门
Department parentDepartment = allDepartments.stream()
.filter(d -> Objects.equals(d.getId(), childDepartment.get().getParentId()))
.findFirst()
.orElse(null);
if (parentDepartment != null) {
// 递归调用,获取父部门的所有父级部门
List<Department> parentDepartments = getParentDepartmentsRecursively(allDepartments, parentDepartment.getId());
// 合并当前父部门和其所有父级部门
return Stream.concat(Stream.of(parentDepartment), parentDepartments.stream())
.collect(Collectors.toList());
}
}
// 如果子部门或其父部门未找到,返回空列表
return new ArrayList<>();
}
}
3. 使用示例
最后,我们创建一个使用示例,演示如何调用DepartmentUtils
类来获取子部门的所有父级部门。这个示例包含了一个包含部门信息的列表,并打印了结果。
import java.util.Arrays;
import java.util.List;
public class Main {
public static void main(String[] args) {
// 创建部门信息列表
List<Department> allDepartments = Arrays.asList(
new Department(1, "部门A", 0),
new Department(2, "部门B", 1),
new Department(3, "部门C", 2),
// 添加其他部门信息
);
// 选择一个子部门的ID进行查询
long childDepartmentId = 3;
// 获取子部门的所有父级部门
List<Department> parentDepartments = DepartmentUtils.getParentDepartments(allDepartments, childDepartmentId);
// 打印结果
System.out.println("子部门的所有父级部门:");
parentDepartments.forEach(department -> System.out.println(department.getName()));
}
}
4. 避免 NullPointerException
在代码中,我们对可能导致NullPointerException
的情况进行了处理,确保在访问属性之前检查了null值。如果子部门或其父部门未找到,我们返回一个空列表而不是null
,以避免潜在的异常。