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("_");
}
您可以使用一长串 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
列表和地图。使用 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) {
...
}
我需要进行一系列空值检查(嵌套空值检查)以获得如下所示的字符串数组
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("_");
}
您可以使用一长串 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
列表和地图。使用 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) {
...
}