[英]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.