前言
stream 是用函數式編程方式在集合類上進行復雜操作的工具,其集成了java 8中的眾多新特性之一的聚合操作,開發者可以更容易地使用lambda表達式,并且更方便地實現對集合的查找、遍歷、過濾以及常見計算等。
最近公司在大張旗鼓的進行代碼審核,從中也發現自己寫代碼的不好習慣。一次無意的點到了公司封裝的對map集合過濾的方法,發現了stream。于是研究了一下。并對原有的代碼再次結合optional進行重構下
原有方法說明
主要處理過濾條件map對象,過濾掉了null和空字符串 等操作
這里我簡單畫了個圖,對這個過程總結
1.利用filter對null和空字符串進行過濾
2.利用map進行對于stream中包含的元素使用給定的轉換函數進行轉換操作
3.collect進行聚合成map
由于公司的代碼不合適自己展示,我這里自己仿照公司的寫了個類似的簡單方法,然后一步一步優化
自定義map工具類處理方法
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
|
//這里的代碼和原先的代碼相比做了修改,去掉了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 ; } |
測試下
1
2
3
4
5
6
7
8
9
10
11
|
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類
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
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 ); } |
是不是感覺更清晰了呢?
測試一下
1
2
3
4
5
6
7
8
9
10
11
12
|
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 )); } |
結果
1
2
3
4
5
6
7
8
|
{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的處理還是很好的。并且實際工作中用到的地方比較多。
好了,以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,如果有疑問大家可以留言交流,謝謝大家對服務器之家的支持。
原文鏈接:https://www.cnblogs.com/zhenghengbin/p/9387547.html