利用stream对map集合进行过滤-阿里云开发者社区

开发者社区> 云计算> 正文
登录阅读全文

利用stream对map集合进行过滤

简介: 最近公司在大张旗鼓的进行代码审核,从中也发现自己写代码的不好习惯。一次无意的点到了公司封装的对map集合过滤的方法,发现了stream。于是研究了一下。并对原有的代码再次结合Optional进行重构下 原有方法说明 主要处理过滤条件Map对象,过滤掉了null和空字符串 等操作 这里我简单画了个图,对这个过程总结 1.

最近公司在大张旗鼓的进行代码审核,从中也发现自己写代码的不好习惯。一次无意的点到了公司封装的对map集合过滤的方法,发现了stream。于是研究了一下。并对原有的代码再次结合Optional进行重构下

原有方法说明

主要处理过滤条件Map对象,过滤掉了null和空字符串 等操作

img_7ef0a380e93777b2a28e74da0d1caa44.png

这里我简单画了个图,对这个过程总结

img_e8294b64d29363abc88870a94b3e9e10.png

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

学习不是要么0分,要么100分的。80分是收获;60分是收获;20分也是收获。有收获最重要。但是因为着眼于自己的不完美,最终放弃了,那就是彻底的0分了。

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

分享:
云计算
使用钉钉扫一扫加入圈子
+ 订阅

时时分享云计算技术内容,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。

其他文章