在Java 8中从第一个流到下一个流api访问对象引用

时间:2019-03-19 05:43:28

标签: java java-8 java-stream

我在下面的现有代码中将一个对象转换为另一个对象-

for(Department dept : company.getDepartments()) {
  if(!isEmpty(dept.getEmployees())) {
        for(Employee emp : dept.getEmployees()) {

        try {
            employyeV2List.add(new EmployeeV2(emp.getId(),  emp.getFirstName(),..., dept.getId()));
        } catch (ParseException e) {
            //error logger
        }

    }
  }

} 

我想在这里添加Java 8流api而不是两个for循环,但是如果您在try block中看到dept.getId(),则我无法在流API中访问它。我在下面尝试过-

List<Employee> employees = company.getDepartment().stream().map(x -> x.getEmployees())
            .flatMap(x -> x.stream()).collect(Collectors.toList());


List<EmployeeV2> employeeV2List = employees.stream().map(x -> getEmployeeV2(x)).collect(Collectors.toList());

getEmployeeV2()中,我正在创建EmployeeV2对象。但是我不确定如何将部门传递到这里,以便可以访问部门ID。

2 个答案:

答案 0 :(得分:3)

您可以这样做

List<EmployeeV2> result = company.getDepartment().stream()
    .flatMap(d -> d.getEmployees().stream()
        .map(e -> new EmployeeV2(e.getId(), e.getFirstName(), d.getId())))
    .collect(Collectors.toList());

答案 1 :(得分:0)

由于EmployeeV2类的构造函数引发Exception,因此您可以根据所需的业务逻辑使用不同的选项来解决此问题。

第一个是在Lambda中捕获异常:

List<EmployeeV2> result = company.getDepartment().stream()
        .flatMap(d -> d.getEmployees().stream()
                .map(e -> {
                    try {
                        return new EmployeeV2(e.getId(), e.getFirstName(), d.getId());
                    } catch (ParseException exception) {
                        return null;
                    }
                }))
        .filter(Objects::nonNull)
        .collect(Collectors.toList());

这具有一个优势,即获取可以创建的所有雇员的列表。但是您不会注意到失败。

第二种方法是更新EmployeeV2的构造函数,并抛出某种RuntimeException,而您不需要在Lambda中捕获它:

try {
    List<EmployeeV2> result = company.getDepartment().stream()
            .flatMap(d -> d.getEmployees().stream()
                    .map(e -> new EmployeeV2(e.getId(), e.getFirstName(), d.getId())))
            .collect(Collectors.toList());
} catch (UncheckedParseException exception) {
    // handle the exception
}

这个优点是您会注意到错误,但不会获得成功创建的员工列表。

我希望这两个示例可以帮助您确定应用程序的正确用法。您还可以像在问题中那样将外部处理的异常处理外包。