Получение и установка значений в java 8 с использованием optional и map - PullRequest
0 голосов
/ 16 июня 2020

Я пытаюсь использовать Optional вместо стандартных нулевых проверок в java

@Data
public class InputObj {
    private Double savings;
} 

@Data
public class Result {
    private String outputSavings;
}

public Result convertInputObjToResult(InputObj inputObj){
    Result result = new Result();

    Optional<InputObj> optionalInputObj = Optional.ofNullable(inputObj);

    optionalInputObj.map(InputObj::getSavings).map(value -> util.convertRoundAndAbs(value,true)).ifPresent(result::setOutputSavings);

    return result;
}

, что эквивалентно ниже

public Result convertInputObjToResult(InputObj inputObj){
    Result result = new Result();

    if(inputObj != null){
               if(inputObj.getSavings() != null){ 
        result.setOutputSavings(util.convertRoundAndAbs(inputObj.getSavings(),true));
    }    

    }

    return result;
}

Я написал несколько тестовых случаев, и я не получаю исключения Null Pointer Exception, но я не могу понять, что условие ifPresent находится в конце, а map - раньше, но все же я не получаю NPE. Вы видите что-то неправильное в этом коде или как его можно улучшить? Это часть приложения весенней загрузки, а для ломбока используется аннотация @Data.

Ответы [ 2 ]

0 голосов
/ 17 июня 2020

Здесь ссылка для дальнейшего описания того, как работает операция карты для Java необязательного класса.

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

Таким образом, в случае, когда у вас есть нулевое значение из метода map, оно будет автоматически преобразовано в Optional.empty().

Затем, взяв , посмотрите на метод ifPresent

Если значение присутствует, вызовите указанного потребителя со значением, в противном случае ничего не делайте.

Итак вот почему вы не получаете NPE; операции карты могут отображать null результаты или переданные значения в Optional.empty(), а операция ifPresent не выполняется, если передано пустое значение Optional.

0 голосов
/ 17 июня 2020

Нет проблем с кодом, за исключением опечатки «optionalMembershipDetails». Предполагая, что вы хотели использовать optionalInputObj. Вам нужно прочитать около java потоков, чтобы понять всю концепцию. Короче говоря, операции оцениваются ленивым образом. Таким образом, вызов ifPresent будет запускать операции, которые появляются перед ним. В этом случае объект заключен внутрь optional, поэтому каждая промежуточная операция передаст другой optional в следующую операцию. Наличие Optional предотвращает получение NPE.

...