Java8中利用stream对map集合进行过滤的方法

 更新时间:2018年07月30日 11:07:05   作者:阳光温暖  
这篇文章主要给大家介绍了关于Java8中利用stream对map集合进行过滤的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

前言

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的处理还是很好的。并且实际工作中用到的地方比较多。

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

相关文章

  • Java 爬虫服务器被屏蔽的解决方案

    Java 爬虫服务器被屏蔽的解决方案

    这篇文章主要介绍了Java 爬虫服务器被屏蔽的解决方案,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-10-10
  • SpringBoot实现Excel文件批量上传导入数据库

    SpringBoot实现Excel文件批量上传导入数据库

    这篇文章主要为大家详细介绍了SpringBoot实现Excel文件批量上传导入数据库,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-11-11
  • springboot swagger2注解使用的教程

    springboot swagger2注解使用的教程

    这篇文章主要介绍了springboot swagger2注解使用,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-05-05
  • 浅析SpringMVC中的适配器HandlerAdapter

    浅析SpringMVC中的适配器HandlerAdapter

    这篇文章主要介绍了SpringMVC中的适配器HandlerAdapter的相关资料,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-01-01
  • 一个Java中BigDecimal的问题记录

    一个Java中BigDecimal的问题记录

    这篇文章主要给大家介绍了关于Java中一个BigDecimal问题的相关资料,通过文中介绍的方法可以很方便的解决BigDecimal进行计算的时候不管怎么计算,最后得到的值都没有变化的问题,需要的朋友可以参考下
    2021-11-11
  • Springboot集成SSE实现单工通信消息推送流程详解

    Springboot集成SSE实现单工通信消息推送流程详解

    SSE简单的来说就是服务器主动向前端推送数据的一种技术,它是单向的,也就是说前端是不能向服务器发送数据的。SSE适用于消息推送,监控等只需要服务器推送数据的场景中,下面是使用Spring Boot来实现一个简单的模拟向前端推动进度数据,前端页面接受后展示进度条
    2022-11-11
  • Java如何获取当前进程ID以及所有Java进程的进程ID

    Java如何获取当前进程ID以及所有Java进程的进程ID

    本篇文章主要介绍了Java如何获取当前进程ID以及所有Java进程的进程ID,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-06-06
  • spring Retryable注解实现重试详解

    spring Retryable注解实现重试详解

    这篇文章主要介绍了spring Retryable注解实现重试详解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-09-09
  • Spring Boot详细打印启动时异常堆栈信息详析

    Spring Boot详细打印启动时异常堆栈信息详析

    这篇文章主要给大家介绍了关于Spring Boot详细打印启动时异常堆栈信息的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用Spring Boot具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-10-10
  • 基于Properties实现配置数据库驱动

    基于Properties实现配置数据库驱动

    这篇文章主要介绍了基于Properties实现配置数据库驱动,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-05-05

最新评论