Вложенная нулевая проверка Java 8 для строки в карте в списке - PullRequest
2 голосов
/ 21 мая 2019

Мне нужно выполнить серию нулевых проверок (вложенных нулевых проверок), чтобы получить массив строк, как показано ниже

String[] test;
if(CollectionUtils.isNotEmpty(checkList)){
    if(MapUtils.isNotEmpty(checkList.get(0))){
        if(StringUtils.isNotBlank(checkList.get(0).get("filename"))){
            test = checkList.get(0).get("filename").split("_");
        }
    }
}

Есть ли лучший способ, возможно, с использованием Java8 Optional, для выполнения подобных вложенных проверок? Я безуспешно пытался использовать Optional с flatmap / map.

Ответы [ 3 ]

2 голосов
/ 21 мая 2019

Вы можете использовать длинную цепочку операций Optional и Stream для поэтапного преобразования ввода в вывод. Примерно так (не проверено):

String[] test = Optional.ofNullable(checkList)
    .map(Collection::stream)
    .orElseGet(Stream::empty)
    .findFirst()
    .map(m -> m.get("filename"))
    .filter(f -> !f.trim().isEmpty())
    .map(f -> f.split("_"))
    .orElse(null);

Я бы настоятельно рекомендовал вам прекратить использование null списков и карт. Гораздо лучше использовать пустых коллекций, чем null коллекций, так что вам не нужно иметь нулевые проверки повсюду. Кроме того, не допускайте пустых или пустых строк в ваших коллекциях; отфильтруйте их или замените на null раньше, как только вы преобразуете пользовательский ввод в объекты в памяти. Вам не нужно вставлять вызовы на номера trim() и isBlank() и т. П. Повсюду.

Если бы вы сделали это, вы могли бы упростить до:

String[] test = checkList.stream()
    .findFirst()
    .map(m -> m.get("filename"))
    .map(f -> f.split("_"))
    .orElse(null);

Намного приятнее, нет?

1 голос
/ 21 мая 2019

Не вкладывайте if s, а просто разверните и инвертируйте их:

String[] defaultValue = // let this be what ever you want

if(checkList == null || checkList.isEmpty()) {
    return defaultValue;
}

Map<String, String> map = checkList.get(0);
if(map == null || map.isEmpty()) {
    return defaultValue;
}

String string = map.get("filename");
if(string == null || string.trim().isEmpty()) {
    return defaultValue;
}

return string.split("_");

Хотя это работает только тогда, когда вы переносите эту логику извлечения в методе:

public static String[] unwrap(List<Map<String, String>> checkList) {
    ...
}
0 голосов
/ 21 мая 2019

Если checkList равен нулю, он выдаст исключение нулевого указателя на CollectionUtils.isNotEmpty (checkList). Также используйте встроенный пустой чекер. Лучше тебе код

        if (null != checkList && !checkList.isEmpty() 
                && null != checkList.get(0) && !checkList.get(0).isEmpty()
                && StringUtils.isNotBlank(checkList.get(0).get("filename"))) {

            test = checkList.get(0).get("filename").split("_");

        }
...