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 ); } |
不积跬步无以至千里,不积小流无以成江海
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 字符编码:从基础到乱码解决
2018-10-24 html如何给图片加角标