2

假设我有以下

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 和 for其中一个用户,一名员工不活跃,那么返回的列表应该只有 2 个元素。

关于如何添加该行为的任何建议?

4

2 回答 2

7

使mapToEmployee返回一个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
}
于 2021-08-23T14:33:57.520 回答
2

在任何情况下,您都需要为每个员工查询数据库,所以我建议:

  • 映射所有员工(不要在映射器中按 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;
}

我建议您将映射器用作映射器,而不是用作映射器 + 特定验证器。该验证应在该过程的后期进行。这将使代码更清晰,更可重用。此外,您可能想重命名getEmployeesgetActiveEmployees

编辑:感谢@MA 提醒我Optional

于 2021-08-23T14:34:05.763 回答