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