Упростите многие проверки if с помощью Optional - PullRequest
1 голос
/ 07 мая 2020
if (reg[0] != null && reg[0].trim().length() > 0) {
   orderData.setCity(reg[0]);
}
if (reg[1] != null && reg[1].trim().length() > 0) {
   orderData.setCountry(reg[1]);
}
if (reg[2] != null && reg[2].trim().length() > 0) {
   orderData.setObjectType(reg[2]);
}
if (reg[3] != null && reg[3].trim().length() > 0) {
   orderData.setChannel(reg[3]);
}

Могу ли я упростить это с помощью Optional или других функций Java 8?

Ответы [ 4 ]

4 голосов
/ 07 мая 2020

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

private Optional<String> validInput(String input) {
    return Optional.ofNullable(input)
                   .filter(in -> in.trim().length() > 0);
}

, тогда это можно использовать как

validInput(reg[0]).ifPresent(city -> orderData.setCity(city));
validInput(reg[1]).ifPresent(country -> orderData.setCountry(country));
... and the likes
3 голосов
/ 07 мая 2020

Optional здесь будет неподходящим инструментом.

Кредитное плечо StringUtils.isNotBlank.

if (StringUtils.isNotBlank(reg[0])) {
   orderData.setCity(reg[0]);
}

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

2 голосов
/ 07 мая 2020

Необязательный, вероятно, здесь вам не поможет.

Первое, о чем следует подумать, - это контрольные значения. Здесь вы четко указываете, что считаете, что семантически значение reg[0] null эквивалентно тому, что reg[0] является пустой строкой (или даже строкой, содержащей только пробелы). Это должно быть необычно. null не означает «ничего» или «пустой». null должен быть заменой для «Нет значения». Лучший способ сделать это - найти место, которое генерирует reg[0], и убедиться, что здесь задано правильное значение semanti c (пустая строка). Тогда этот код может быть просто: if (!reg[0].isEmpty()) orderData.setCity(reg[0]); - намного чище.

Это, конечно, не всегда возможно. Например, если reg идет по конвейеру из библиотеки или другого кода, который просто не находится под вашим контролем, или это объект, созданный, скажем, демаршаллером JSON.

In В этом случае я бы обычно советовал создать явный шаг для преобразования объекта, который «не является чистым» (имеет нули, даже когда семантически предполагается, что это пустая строка) в чистую.

Если это невозможно или невозможно, ну, работать с «нечистым» предметом никогда не будет особенно красиво, с точки зрения стиля. Здесь очень поможет вспомогательный метод:

normalizeThenSetIfNonBlank(reg[0], orderData::setCity);
normalizeThenSetIfNonBlank(reg[1], orderData::setCountry);

private void normalizeThenSetIfNonBlank(String in, Consumer<String> target) {
    if (in == null) return;
    in = in.trim();
    if (in.isEmpty()) return;
    target.accept(in);
}
0 голосов
/ 07 мая 2020
Optional.ofNullable(reg[0]).filter(val -> val.trim().length() > 0).ifPresent(orderData::setCity);
Optional.ofNullable(reg[1]).filter(val -> val.trim().length() > 0).ifPresent(orderData::setCountry);
Optional.ofNullable(reg[2]).filter(val -> val.trim().length() > 0).ifPresent(orderData::setObjectType);
Optional.ofNullable(reg[3]).filter(val -> val.trim().length() > 0).ifPresent(orderData::setChannel);
...