• 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);
     }
     
  • 相关阅读:
    Android常用命令
    kafka原理和集群配置
    zookeeper原理和集群配置
    python中is和==的区别以及全字段取出key和value
    Android Monkey压力测试介绍
    有一串随机整数列,a1,a2,...an,求数字[0-9]分别出现的次数,比如:[12, 210, 33]输出{'0': 1, '1': 2, '2': 2, '3': 2},时间和空间复杂度
    接口自动化get请求方式的处理
    读excel和openpyxl模块
    linux上安装Docker
    [数据结构]堆的建立和排序
  • 原文地址:https://www.cnblogs.com/YuyuanNo1/p/13869287.html
Copyright © 2020-2023  润新知