Java8中利用stream對map集合進行過濾的方法
前言
Stream 是用函數(shù)式編程方式在集合類上進行復(fù)雜操作的工具,其集成了Java 8中的眾多新特性之一的聚合操作,開發(fā)者可以更容易地使用Lambda表達式,并且更方便地實現(xiàn)對集合的查找、遍歷、過濾以及常見計算等。
最近公司在大張旗鼓的進行代碼審核,從中也發(fā)現(xiàn)自己寫代碼的不好習(xí)慣。一次無意的點到了公司封裝的對map集合過濾的方法,發(fā)現(xiàn)了stream。于是研究了一下。并對原有的代碼再次結(jié)合Optional進行重構(gòu)下
原有方法說明
主要處理過濾條件Map對象,過濾掉了null和空字符串 等操作
這里我簡單畫了個圖,對這個過程總結(jié)
1.利用filter對null和空字符串進行過濾
2.利用map進行對于Stream中包含的元素使用給定的轉(zhuǎn)換函數(shù)進行轉(zhuǎn)換操作
3.collect進行聚合成map
由于公司的代碼不合適自己展示,我這里自己仿照公司的寫了個類似的簡單方法,然后一步一步優(yōu)化
自定義map工具類處理方法
//這里的代碼和原先的代碼相比做了修改,去掉了map進行對于Stream中包含的元素使用給定的轉(zhuǎn)換函數(shù)進行轉(zhuǎn)換操作 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)); }
輸出結(jié)果
{c=c}
null
優(yōu)化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)); }
結(jié)果
{c=c} null 優(yōu)化checkValue方法 private static boolean checkValueByOptional(Object object) { return (Boolean) Optional.ofNullable(object) .filter((e) -> e instanceof String && e.equals("") ? false : true) .orElse(false); }
總結(jié)
大家是不是感覺lambda 寫法更加簡單明了,不再充滿著if判斷。但如果大家首寫的時候,肯定感覺不習(xí)慣,我剛開始寫的時候,也是很別扭,根本不知道怎么寫。一點點去嘗試。更多細節(jié)基礎(chǔ)的問題這里不再敘述。
只是感覺這個對map的處理還是很好的。并且實際工作中用到的地方比較多。
好了,以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,如果有疑問大家可以留言交流,謝謝大家對腳本之家的支持。
相關(guān)文章
Java?SpringBoot?獲取接口實現(xiàn)類匯總
這篇文章主要介紹了Java?SpringBoot?獲取接口實現(xiàn)類匯總,文章圍繞主題展開詳細的內(nèi)容介紹,具有一定的參考價值,需要的小伙伴可以參考一下2022-09-09Java中實現(xiàn)時間類型轉(zhuǎn)換的代碼詳解
這篇文章主要為大家詳細介紹了Java中實現(xiàn)時間類型轉(zhuǎn)換的相關(guān)方法,文中的示例代碼講解詳細,具有一定的借鑒價值,有需要的小伙伴可以參考下2023-09-09Kotlin基礎(chǔ)教程之控制流(順序,分支,循環(huán))
這篇文章主要介紹了Kotlin基礎(chǔ)教程之控制流的相關(guān)資料,需要的朋友可以參考下2017-05-05基于Java實現(xiàn)簡易的局域網(wǎng)對話系統(tǒng)
這篇文章主要介紹了基于Java實現(xiàn)的簡易的局域網(wǎng)對話系統(tǒng),文中的示例代碼對我們學(xué)習(xí)Java有一定的幫助,感興趣的小伙伴快來跟隨小編一起學(xué)習(xí)一下吧2021-12-12