Java8中利用stream對map集合進行過濾的方法


前言

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 );
  }
 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM