最近公司在大张旗鼓的进行代码审核,从中也发现本身写代码的很差习惯。一次无心的点到了公司封装的对map集合过滤的方法,发现了stream。因而研究了一下。并对原有的代码再次结合Optional进行重构下函数
主要处理过滤条件Map对象,过滤掉了null和空字符串 等操做工具
这里我简单画了个图,对这个过程总结测试
因为公司的代码不合适本身展现,我这里本身仿照公司的写了个相似的简单方法,而后一步一步优化优化
//这里的代码和原先的代码相比作了修改,去掉了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; }
测试下code
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
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); }
是否是感受更清晰了呢?字符串
测试一下get
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)); }
结果io
{c=c} null
private static boolean checkValueByOptional(Object object) { return (Boolean) Optional.ofNullable(object) .filter((e) -> e instanceof String && e.equals("") ? false : true) .orElse(false); }
你们是否是感受lambda 写法更加简单明了,再也不充满着if判断。但若是你们首写的时候,确定感受不习惯,我刚开始写的时候,也是很别扭,根本不知道怎么写。一点点去尝试。更多细节基础的问题这里再也不叙述。stream
只是感受这个对map的处理仍是很好的。而且实际工做中用到的地方比较多。