Java8中利用stream对map集合进行过滤的方法
程序员文章站
2024-02-18 20:51:58
前言
stream 是用函数式编程方式在集合类上进行复杂操作的工具,其集成了java 8中的众多新特性之一的聚合操作,开发者可以更容易地使用lambda表达式,并且更方便...
前言
stream 是用函数式编程方式在集合类上进行复杂操作的工具,其集成了java 8中的众多新特性之一的聚合操作,开发者可以更容易地使用lambda表达式,并且更方便地实现对集合的查找、遍历、过滤以及常见计算等。
最近公司在大张旗鼓的进行代码审核,从中也发现自己写代码的不好习惯。一次无意的点到了公司封装的对map集合过滤的方法,发现了stream。于是研究了一下。并对原有的代码再次结合optional进行重构下
原有方法说明
主要处理过滤条件map对象,过滤掉了null和空字符串 等操作
这里我简单画了个图,对这个过程总结
1.利用filter对null和空字符串进行过滤
2.利用map进行对于stream中包含的元素使用给定的转换函数进行转换操作
3.collect进行聚合成map
由于公司的代码不合适自己展示,我这里自己仿照公司的写了个类似的简单方法,然后一步一步优化
自定义map工具类处理方法
//这里的代码和原先的代码相比做了修改,去掉了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; }
测试下
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类
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); }
是不是感觉更清晰了呢?
测试一下
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)); }
结果
{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的处理还是很好的。并且实际工作中用到的地方比较多。
好了,以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对的支持。