最近公司在大張旗鼓的進行代碼審核,從中也發現自己寫代碼的不好習慣。一次無意的點到了公司封裝的對map集合過濾的方法,發現了stream。於是研究了一下。並對原有的代碼再次結合Optional進行重構下
原有方法說明
主要處理過濾條件Map對象,過濾掉了null和空字符串 等操作
這里我簡單畫了個圖,對這個過程總結
- 1.利用filter對null和空字符串進行過濾
- 2.利用map進行對於Stream中包含的元素使用給定的轉換函數進行轉換操作
- 3.collect進行聚合成map
由於公司的代碼不合適自己展示,我這里自己仿照公司的寫了個類似的簡單方法,然后一步一步優化
自定義map工具類處理方法
//這里的代碼和原先的代碼相比做了修改,去掉了map進行對於Stream中包含的元素使用給定的轉換函數進行轉換操作
public static Map<String, Object> parseMapForFilter(Map<String, Object> map) {
if (map == null) {
return null;
} else {
map = map.entrySet().stream()
.filter((e) -> checkValue(e.getValue()))
.collect(Collectors.toMap(
(e) -> (String) e.getKey(),
(e) -> e.getValue()
));
}
return map;
}
private static boolean checkValue(Object object) {
if (object instanceof String && "".equals(object)) {
return false;
}
if (null == object) {
return false;
}
return true;
}
測試下
public static void main(String[] args) {
Map<String,Object> params = new HashMap<>(16);
params.put("a","");
params.put("b",null);
params.put("c","c");
params = MapUtil.parseMapForFilter(params);
System.out.println(params);
System.out.println(MapUtil.parseMapForFilter(null));
}
輸出結果
{c=c}
null
優化parseMapForFilter 方法,加入Optional類
public static Map<String, Object> parseMapForFilterByOptional(Map<String, Object> map) {
return Optional.ofNullable(map).map(
(v) -> {
Map params = v.entrySet().stream()
.filter((e) -> checkValue(e.getValue()))
.collect(Collectors.toMap(
(e) -> (String) e.getKey(),
(e) -> e.getValue()
));
return params;
}
).orElse(null);
}
是不是感覺更清晰了呢?
測試一下
public static void main(String[] args) {
Map<String, Object> params = new HashMap<>(16);
params.put("a", "");
params.put("b", null);
params.put("c", "c");
params = MapUtil.parseMapForFilterByOptional(params);
System.out.println(params);
System.out.println(MapUtil.parseMapForFilterByOptional(null));
}
結果
{c=c}
null
優化checkValue方法
private static boolean checkValueByOptional(Object object) {
return (Boolean) Optional.ofNullable(object)
.filter((e) -> e instanceof String && e.equals("") ? false : true)
.orElse(false);
}
總結
大家是不是感覺lambda 寫法更加簡單明了,不再充滿着if判斷。但如果大家首寫的時候,肯定感覺不習慣,我剛開始寫的時候,也是很別扭,根本不知道怎么寫。一點點去嘗試。更多細節基礎的問題這里不再敘述。
只是感覺這個對map的處理還是很好的。並且實際工作中用到的地方比較多。