我在下面的现有代码中将一个对象转换为另一个对象-
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。
答案 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
}
这个优点是您会注意到错误,但不会获得成功创建的员工列表。
我希望这两个示例可以帮助您确定应用程序的正确用法。您还可以像在问题中那样将外部处理的异常处理外包。