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

posted on 2020-10-24 14:06  小甜瓜安东泥  阅读(4795)  评论(0编辑  收藏  举报