Проверка входных данных с использованием необязательных - PullRequest
0 голосов
/ 10 января 2019

У меня есть экземпляр CreateOrder, в котором есть несколько состояний String, Integer и Double. Когда я создаю объект для CreateOrder в своем тесте JUnit и отправляю его, я могу проверять атрибуты String, но не Integer, используя необязательный API следующим образом -

String aoid = Optional.ofNullable(createOrder.getAltorderid()).orElse("");

int quantity = Integer.parseInt(each.getQty());
double amount = Double.parseDouble(each.getPrice().getAmount());

Как и для aoid, я также хочу использовать пользователь Nullable () для целого числа, но не могу понять, как это сделать. Мое намерение заключается в том, чтобы сделать мой код безопасным от NullPointerExceptions и, следовательно, я хочу сделать пользователя мощным Optional для Integer и Double. Я довольно новичок в Java 8 и запутался, если мне нужно использовать OptionalInt или Optional<Integer>? Если Optional<Integer>, как использовать его, как я использовал для String?

Ответы [ 3 ]

0 голосов
/ 10 января 2019

Попробуйте это

Optional.ofNullable(each.getQty()).map(Integer::valueOf).orElse(0)
0 голосов
/ 10 января 2019

Прежде всего я думаю, что вы неправильно понимаете цель Optional.

Суть Необязательно заключается в предоставлении средств для функции, возвращающей значение, указывающее на отсутствие возвращаемого значения . См. это обсуждение . Это позволяет вызывающей стороне продолжать цепочку быстрых вызовов методов.

Стюарт Маркс , Java и OpenJDK разработчик

Таким образом, чтобы правильно использовать Optional API, вам необходимо переосмыслить свой код. Предполагая, что ваш each имеет значение nullable aoid, ваш .getAltOrderId() метод должен быть реализован следующим образом:

Optional<String> getAltOrderId() {
    return Optional.ofNullable(this.aoid);
}  

Тогда вы можете использовать его следующим образом:

String aoid = createOrder.getAltOrderId().orElse("");

Пожалуйста, прочитайте этот пост для более подробного объяснения.

Если вы изменили метод .getQty() для возврата Optional<String>, это должно сделать то, что вам нужно:

int quantity = each.getQty()
                   .map(Integer::valueOf)
                   .orElse(0);
0 голосов
/ 10 января 2019
Integer.parseInt(each.getQty())

достаточно безопасен, поскольку, если each.getQty равно null, вы в конечном итоге получите NumberFormatException, и это должно быть поведение, когда вы пытаетесь разобрать строку в целое число и не уверены в этом.

С другой стороны, вы можете по умолчанию установить значение 0 для значения null как:

int quantity = Optional.ofNullable(each.getQty())
                       .map(Integer::parseInt)
                       .orElse(0);

аналогично для amount

double amount = Optional.ofNullable(each.getPrice().getAmount())
        .map(Double::parseDouble)
        .orElse(Double.NaN);
...