如果条件不满足,如何跳过映射元素
How to skip mapping an element if condition not satisfied
假设我有以下内容
public class UserEntity{
String id;
List<String> relatedEntity;
}
public class EmployeeEntity{
String id;
String name;
Boolean isActive;
List<String> relatedEntityDetails;
}
现在有了 UserEntity 列表,我必须映射到 EmployeeEntity 列表:
private List<EmployeeEntity> getEmployees(List<UserEntity> users)
return users.stream()
.filter(x-> !x.getRelatedEntity().isEmpty())
.map(this::mapToEmployee)
.collect(Collectors.toList());
}
private EmployeeEntity mapToEmployee(UserEntity userEntity){
// retrieve EmployeeEntity from DB and perform a validations like
// employeeEntity.isActive = true
return employeeEntity;
}
现在,一切正常,但是我需要处理 EmployeeEntity 不存在于数据库中的情况,或者 isActive = false,在这些情况下,应该跳过 map(),所以如果有一个列表3 个元素 UserEntity 并且对于其中一个用户,一名员工不活跃,那么返回的列表应该只有 2 个元素。
关于如何添加该行为有什么建议吗?
将mapToEmployee
return设为Optional<EmployeeEntity>
,过滤掉不为空的:
private List<EmployeeEntity> getEmployees(List<UserEntity> users)
return users.stream()
.filter(x-> !x.getRelatedEntity().isEmpty())
.map(this::mapToEmployee)
.filter(Optional::isPresent)
.map(Optional::get)
.collect(Collectors.toList());
}
private Optional<EmployeeEntity> mapToEmployee(UserEntity userEntity){
... optional depending on whether it is present in DB and/or is active
}
在任何情况下,您都需要为每个员工查询数据库,所以我建议:
- 映射所有员工(不要在映射器中按 isActive 过滤,请参阅代码中的注释)
- 过滤不活跃的员工
private List<EmployeeEntity> getEmployees(List<UserEntity> users)
return users.stream()
.filter(x-> !x.getRelatedEntity().isEmpty())
.map(this::mapToEmployee)
.filter(Optional::isPresent)
.map(Optional::get)
.filter(EmployeeEntity::isActive)
.collect(Collectors.toList());
}
private Optional<EmployeeEntity> mapToEmployee(UserEntity userEntity){
// return the db employee whatsoever, i believe the mapper should not be responssible for logic validation
if (employeeDoesNotExistsInDb) {
return Optional.empty();
}
return employeeEntity;
}
我建议您将映射器用作映射器,而不是映射器 + 特定验证器。该验证应该在流程的后期进行。这将使代码更清晰,更可重用。此外,您可能希望将 getEmployees
重命名为 getActiveEmployees
编辑:感谢@M A 提醒我 Optional
假设我有以下内容
public class UserEntity{
String id;
List<String> relatedEntity;
}
public class EmployeeEntity{
String id;
String name;
Boolean isActive;
List<String> relatedEntityDetails;
}
现在有了 UserEntity 列表,我必须映射到 EmployeeEntity 列表:
private List<EmployeeEntity> getEmployees(List<UserEntity> users)
return users.stream()
.filter(x-> !x.getRelatedEntity().isEmpty())
.map(this::mapToEmployee)
.collect(Collectors.toList());
}
private EmployeeEntity mapToEmployee(UserEntity userEntity){
// retrieve EmployeeEntity from DB and perform a validations like
// employeeEntity.isActive = true
return employeeEntity;
}
现在,一切正常,但是我需要处理 EmployeeEntity 不存在于数据库中的情况,或者 isActive = false,在这些情况下,应该跳过 map(),所以如果有一个列表3 个元素 UserEntity 并且对于其中一个用户,一名员工不活跃,那么返回的列表应该只有 2 个元素。
关于如何添加该行为有什么建议吗?
将mapToEmployee
return设为Optional<EmployeeEntity>
,过滤掉不为空的:
private List<EmployeeEntity> getEmployees(List<UserEntity> users)
return users.stream()
.filter(x-> !x.getRelatedEntity().isEmpty())
.map(this::mapToEmployee)
.filter(Optional::isPresent)
.map(Optional::get)
.collect(Collectors.toList());
}
private Optional<EmployeeEntity> mapToEmployee(UserEntity userEntity){
... optional depending on whether it is present in DB and/or is active
}
在任何情况下,您都需要为每个员工查询数据库,所以我建议:
- 映射所有员工(不要在映射器中按 isActive 过滤,请参阅代码中的注释)
- 过滤不活跃的员工
private List<EmployeeEntity> getEmployees(List<UserEntity> users)
return users.stream()
.filter(x-> !x.getRelatedEntity().isEmpty())
.map(this::mapToEmployee)
.filter(Optional::isPresent)
.map(Optional::get)
.filter(EmployeeEntity::isActive)
.collect(Collectors.toList());
}
private Optional<EmployeeEntity> mapToEmployee(UserEntity userEntity){
// return the db employee whatsoever, i believe the mapper should not be responssible for logic validation
if (employeeDoesNotExistsInDb) {
return Optional.empty();
}
return employeeEntity;
}
我建议您将映射器用作映射器,而不是映射器 + 特定验证器。该验证应该在流程的后期进行。这将使代码更清晰,更可重用。此外,您可能希望将 getEmployees
重命名为 getActiveEmployees
编辑:感谢@M A 提醒我 Optional