Java 8 嵌套 null 检查列表中映射中的字符串

Java 8 nested null check for a string in a map in a list

我需要进行一系列空值检查(嵌套空值检查)以获得如下所示的字符串数组

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 与 flatmap / map 一起使用,但没有成功。

如果checkList为null,则会在CollectionUtils.isNotEmpty(checkList)上抛出空指针异常。也使用 in-built 空检查器。 最好你编码

        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("_");

        }

您可以使用一长串 OptionalStream 操作将输入逐步转换为输出。像这样(未经测试):

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 列表和地图。使用 empty 集合比 null 集合要好得多,这样你就不必到处进行 null 检查。此外,不要让空字符串进入您的集合;将用户输入转换为 in-memory 对象后,尽早过滤掉它们或用 null 替换它们。您不想到处插入对 trim()isBlank() 之类的调用。

如果这样做,您可以简化为:

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

好多了,不是吗?

不要嵌套 if,只是展开并反转它们:

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