Tengo que convertir un Optional<EmployeeModel>
objeto a Optional<EmployeeDto>
y estoy buscando algunas opciones mejor / más limpio que el de abajo dos.
Opción 1:
public Optional<EmployeeDto> findById(String employeeId){
Optional<EmployeeModel> employeeModel = employeeService.findById(employeeId);
return Optional.ofNullable(toEmployeeDto(toEmployeeDto.orElse(null)));
}
private EmployeeDto toEmployeeDto(EmployeeModel employeeModel) {
if(employeeModel != null) {//We need this because orElse passes null
//return EmployeeDto (convert EmployeeModel to dto)
} else {
return null;
}
}
Opcion 2:
public Optional<EmployeeDto> findById(String employeeId){
Optional<EmployeeModel> employeeModel = employeeService.findById(employeeId);
if(employeeModel.isPresent()) {
return Optional.of(toEmployeeDto(employeeModel.get()));
} else {
return Optional.empty();
}
}
private EmployeeDto toEmployeeDto(EmployeeModel employeeModel) {
//isPresent()check already done so no null checks
//return EmployeeDto (convert EmployeeModel to dto)
}
No puedo utilizar Optional.map()
directamente como EmployeeModel
objeto puede ser nulo (es decir, null
envuelta por Optional
) de la employeeService
. Además, estaba comprobando el código fuente para el map()
método dentro de Optional
la clase que realiza la verificación a continuación:
Objects.requireNonNull(mapper);
En resumen, mi pregunta es que podemos pasar null
objetos a Optional
's map()
método? Si es así, ¿por qué el Objects.requireNonNull()
cheque en el código fuente?
Utilice el Optional.map()
método:
Si un valor está presente, aplicar la función de mapeo proporcionado a ella, y si el resultado es no nulo, devolver un
Optional
describiendo el resultado. De lo contrario, devolver un vacíoOptional
.
public Optional<EmployeeDto> findById(String employeeId){
Optional<EmployeeModel> employeeModel = employeeService.findById(employeeId);
return employeeModel.map(this::toEmployeeDto);
}
private EmployeeDto toEmployeeDto(EmployeeModel employeeModel) {
//employeeModel will not be null, so:
//return EmployeeDto (convert EmployeeModel to dto)
}