zoukankan      html  css  js  c++  java
  • java通过key-list和对应value更新当前对象

    当前有一个复杂对象,类似json,现在要对当前对象进行更新(已有的key更新,未有的key插入)

    //递归更新一个json对象,原对象若没有则插入key,精妙!
        @SuppressWarnings("unchecked")
        Object setObjectRecursive(Object current, final List<String> paths,
                                  int index, final Object value) {
    
            // 如果是已经超出path,我们就返回value即可,作为最底层叶子节点
            boolean isLastIndex = index == paths.size();
            if (isLastIndex) {
                return value;
            }
    
            String path = paths.get(index).trim();
            boolean isNeedMap = isPathMap(path);
            if (isNeedMap) {
                Map<String, Object> mapping;
    
                // 当前不是map,因此全部替换为map,并返回新建的map对象
                boolean isCurrentMap = current instanceof Map;
                if (!isCurrentMap) {
                    mapping = new HashMap<String, Object>();
                    mapping.put(
                            path,
                            buildObject(paths.subList(index + 1, paths.size()),
                                    value));
                    return mapping;
                }
    
                // 当前是map,但是没有对应的key,也就是我们需要新建对象插入该map,并返回该map
                mapping = ((Map<String, Object>) current);
                boolean hasSameKey = mapping.containsKey(path);
                if (!hasSameKey) {
                    mapping.put(path,buildObject(paths.subList(index + 1, paths.size()),
                                    value));
                    return mapping;
                }
    
                // 当前是map,而且还竟然存在这个值,好吧,继续递归遍历
                current = mapping.get(path);
                mapping.put(path, setObjectRecursive(current, paths, index + 1, value));
                return mapping;
            }
    
            boolean isNeedList = isPathList(path);
            if (isNeedList) {
                List<Object> lists;
                int listIndexer = getIndex(path);
    
                // 当前是list,直接新建并返回即可
                boolean isCurrentList = current instanceof List;
                if (!isCurrentList) {
                    lists = expand(new ArrayList<Object>(), listIndexer + 1);
                    lists.set(
                            listIndexer,
                            buildObject(paths.subList(index + 1, paths.size()),
                                    value));
                    return lists;
                }
    
                // 当前是list,但是对应的indexer是没有具体的值,也就是我们新建对象然后插入到该list,并返回该List
                lists = (List<Object>) current;
                lists = expand(lists, listIndexer + 1);
    
                boolean hasSameIndex = lists.get(listIndexer) != null;
                if (!hasSameIndex) {
                    lists.set(
                            listIndexer,
                            buildObject(paths.subList(index + 1, paths.size()),
                                    value));
                    return lists;
                }
    
                // 当前是list,并且存在对应的index,没有办法继续递归寻找
                current = lists.get(listIndexer);
                lists.set(listIndexer,
                        setObjectRecursive(current, paths, index + 1, value));
                return lists;
            }
    
            throw DataMException.asDataMException("该异常代表系统编程错误, 请联系DataX开发团队");
        }
    
    
     //根据key的类型来选择获取value的方式
        private boolean isPathMap(final String path) {
            return StringUtils.isNotBlank(path) && !isPathList(path);
        }
    
        private boolean isPathList(final String path) {
            return path.contains("[") && path.contains("]");
        }
  • 相关阅读:
    java8中常用的新功能
    代码走查案例2
    redis的key设置每天凌晨过期的思路
    代码走查案例1
    一场没有序列化引发的血案
    面试总结
    hr相关的
    mysql底层原理
    如何学好并发编程
    流程图总结
  • 原文地址:https://www.cnblogs.com/wangbin2188/p/14188511.html
Copyright © 2011-2022 走看看