Java8中利用stream對(duì)map集合進(jìn)行過濾的方法
前言
Stream 是用函數(shù)式編程方式在集合類上進(jìn)行復(fù)雜操作的工具,其集成了Java 8中的眾多新特性之一的聚合操作,開發(fā)者可以更容易地使用Lambda表達(dá)式,并且更方便地實(shí)現(xiàn)對(duì)集合的查找、遍歷、過濾以及常見計(jì)算等。
最近公司在大張旗鼓的進(jìn)行代碼審核,從中也發(fā)現(xiàn)自己寫代碼的不好習(xí)慣。一次無意的點(diǎn)到了公司封裝的對(duì)map集合過濾的方法,發(fā)現(xiàn)了stream。于是研究了一下。并對(duì)原有的代碼再次結(jié)合Optional進(jìn)行重構(gòu)下
原有方法說明
主要處理過濾條件Map對(duì)象,過濾掉了null和空字符串 等操作

這里我簡(jiǎn)單畫了個(gè)圖,對(duì)這個(gè)過程總結(jié)

1.利用filter對(duì)null和空字符串進(jìn)行過濾
2.利用map進(jìn)行對(duì)于Stream中包含的元素使用給定的轉(zhuǎn)換函數(shù)進(jìn)行轉(zhuǎn)換操作
3.collect進(jìn)行聚合成map
由于公司的代碼不合適自己展示,我這里自己仿照公司的寫了個(gè)類似的簡(jiǎn)單方法,然后一步一步優(yōu)化
自定義map工具類處理方法
//這里的代碼和原先的代碼相比做了修改,去掉了map進(jìn)行對(duì)于Stream中包含的元素使用給定的轉(zhuǎn)換函數(shù)進(jìn)行轉(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;
}
測(cè)試下
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);
}
是不是感覺更清晰了呢?
測(cè)試一下
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 寫法更加簡(jiǎn)單明了,不再充滿著if判斷。但如果大家首寫的時(shí)候,肯定感覺不習(xí)慣,我剛開始寫的時(shí)候,也是很別扭,根本不知道怎么寫。一點(diǎn)點(diǎn)去嘗試。更多細(xì)節(jié)基礎(chǔ)的問題這里不再敘述。
只是感覺這個(gè)對(duì)map的處理還是很好的。并且實(shí)際工作中用到的地方比較多。
好了,以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,如果有疑問大家可以留言交流,謝謝大家對(duì)腳本之家的支持。
相關(guān)文章
Java?SpringBoot?獲取接口實(shí)現(xiàn)類匯總
這篇文章主要介紹了Java?SpringBoot?獲取接口實(shí)現(xiàn)類匯總,文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下2022-09-09
Java中實(shí)現(xiàn)時(shí)間類型轉(zhuǎn)換的代碼詳解
這篇文章主要為大家詳細(xì)介紹了Java中實(shí)現(xiàn)時(shí)間類型轉(zhuǎn)換的相關(guān)方法,文中的示例代碼講解詳細(xì),具有一定的借鑒價(jià)值,有需要的小伙伴可以參考下2023-09-09
Kotlin基礎(chǔ)教程之控制流(順序,分支,循環(huán))
這篇文章主要介紹了Kotlin基礎(chǔ)教程之控制流的相關(guān)資料,需要的朋友可以參考下2017-05-05
基于Java實(shí)現(xiàn)簡(jiǎn)易的局域網(wǎng)對(duì)話系統(tǒng)
這篇文章主要介紹了基于Java實(shí)現(xiàn)的簡(jiǎn)易的局域網(wǎng)對(duì)話系統(tǒng),文中的示例代碼對(duì)我們學(xué)習(xí)Java有一定的幫助,感興趣的小伙伴快來跟隨小編一起學(xué)習(xí)一下吧2021-12-12
MyBatis-Plus之邏輯刪除的實(shí)現(xiàn)
這篇文章主要介紹了MyBatis-Plus之邏輯刪除的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-11-11

