好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

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

  }

总结

大家是不是感觉lambda 写法更加简单明了,不再充满着if判断。但如果大家首写的时候,肯定感觉不习惯,我刚开始写的时候,也是很别扭,根本不知道怎么写。一点点去尝试。更多细节基础的问题这里不再叙述。

只是感觉这个对map的处理还是很好的。并且实际工作中用到的地方比较多。

好了,以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对的支持。

原文链接:https://www.cnblogs.com/zhenghengbin/p/9387547.html

查看更多关于Java8中利用stream对map集合进行过滤的方法的详细内容...

  阅读:65次