最近公司在大張旗鼓的進行代碼審覈,從中也發現本身寫代碼的很差習慣。一次無心的點到了公司封裝的對map集合過濾的方法,發現了stream。因而研究了一下。並對原有的代碼再次結合Optional進行重構下函數
主要處理過濾條件Map對象,過濾掉了null和空字符串 等操做工具
這裏我簡單畫了個圖,對這個過程總結測試
因爲公司的代碼不合適本身展現,我這裏本身仿照公司的寫了個相似的簡單方法,而後一步一步優化優化
//這裏的代碼和原先的代碼相比作了修改,去掉了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; }
測試下code
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
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); }
是否是感受更清晰了呢?字符串
測試一下get
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)); }
結果io
{c=c} null
private static boolean checkValueByOptional(Object object) { return (Boolean) Optional.ofNullable(object) .filter((e) -> e instanceof String && e.equals("") ? false : true) .orElse(false); }
你們是否是感受lambda 寫法更加簡單明瞭,再也不充滿着if判斷。但若是你們首寫的時候,確定感受不習慣,我剛開始寫的時候,也是很彆扭,根本不知道怎麼寫。一點點去嘗試。更多細節基礎的問題這裏再也不敘述。stream
只是感受這個對map的處理仍是很好的。而且實際工做中用到的地方比較多。