zoukankan      html  css  js  c++  java
  • 利用stream对map集合进行过滤

    最近公司在大张旗鼓的进行代码审核,从中也发现自己写代码的不好习惯。一次无意的点到了公司封装的对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的处理还是很好的。并且实际工作中用到的地方比较多。

  • 相关阅读:
    GIF文件转换为头文件工具
    深夜杂想
    swift项目第十天:网络请求工具类的封装
    swift项目第九天:正则表达式的学习
    swift项目第八天:自定义转场动画以及设置titleView的状态
    swift项目第七天:构建访客界面以及监听按钮点击
    swift项目第六天:中间发布按钮的封装以及监听点击事件
    swift项目第五天:swift中storyBoard Reference搭建主界面
    swift项目第四天:动态加载控制器
    swift项目第三天:手写代码搭建主框架
  • 原文地址:https://www.cnblogs.com/zhenghengbin/p/9387547.html
Copyright © 2011-2022 走看看