[英]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)来执行此类嵌套检查? 我尝试将Optional与flatmap / map结合使用失败。
您可以使用一长串的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
。 您不需要isBlank()
都插入对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) {
...
}
如果checkList为null,它将在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("_");
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.