Java преобразовать один необязательный тип в другой необязательный тип - PullRequest
0 голосов
/ 23 октября 2018

Мне нужно преобразовать объект Optional<EmployeeModel> в Optional<EmployeeDto>, и я ищу более лучшие / более чистые варианты, чем два ниже.

Option1:

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;
    }
}

Опция 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)
}

Я не могу использовать Optional.map() напрямую, поскольку EmployeeModel объект может быть нулевым (т. Е. null обернут в Optional)от employeeService.Кроме того, я просто проверял исходный код метода map() внутри класса Optional, который выполняет следующую проверку:

Objects.requireNonNull(mapper);

Короче, мой вопрос в том, можем ли мы передать null объекты в Optional s map() метод?Если да, то почему Objects.requireNonNull() проверяет исходный код?

1 Ответ

0 голосов
/ 23 октября 2018

Используйте метод Optional.map():

Если значение присутствует, примените к нему предоставленную функцию отображения, а если результат не равен нулю, вернитеOptional описание результата.В противном случае вернуть пустое значение Optional.

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)
}
...