Java【代码分享 13】前端动态添加一条记后端使用JDK1.8实现map对象根据key的部分值进行分组(将map对象封装成指定entity对象)

简介: Java【代码分享 13】前端动态添加一条记后端使用JDK1.8实现map对象根据key的部分值进行分组(将map对象封装成指定entity对象)

why

我是后端开发工程师,前端的很多函数不是很了解,所以很多问题期望在后端进行处理。

前端

有这样一个实现,前端要动态添加记录,然后将记录统一存储在一个字段里,代码如下:

// 动态添加一行输入参数描写
function addParamIn() {
    // 输入参数列表
    var paramInList = $('#paramInList');
    // 添加一行
    var tr = $(['<tr>'
        , '<td ><input type="text" name="paramIn-' + data.paramInNum + '-name" placeholder = "输入字段英文名" value="" class="layui-input"></td>'
        , '<td ><input type="text" name="paramIn-' + data.paramInNum + '-cn" placeholder = "输入字段中文名" value="" class="layui-input"></td>'
        , '<td ><select name="paramIn-' + data.paramInNum + '-type" lay-verify="required"> <option value="date">时间</option><option value="varchar">字符串</option></select></td>'
        , '<td ><input type="text" name="paramIn-' + data.paramInNum + '-map" placeholder = "输入映射字段名" value="" class="layui-input"></td>'
        , '<td ><select name="paramIn-' + data.paramInNum + '-isRequired" lay-verify="required"> <option value="1">是</option><option value="0">否</option></select></td>'
        , '<td ><input type="text" name="paramIn-' + data.paramInNum + '-defaultVal" placeholder = "输入默认值" value="" class="layui-input"></td>'
        , '<td>'
        , '<button class="layui-btn layui-btn-xs layui-btn-danger specialConfig-delete">删除</button>'
        , '</td>'
        , '</tr>'].join(''));
    // 删除当前行
    tr.find('.specialConfig-delete').on('click', function () {
        tr.remove();
    });
    // 页面追加一行、输入参数个数加一
    paramInList.append(tr);
    // 重新渲染 下拉选
    form.render("select");
    data.paramInNum += 1;
}

可以看的出来,传输到后端后,输入参数是多个map对象,比如:

{
// 其他参数
"source":"sourceTableName",
"view":"全部展示",
"desc":"查询特殊时段的异常信息",
...
// 输入参数【主要要处理的】
// 第一行
"paramIn-0-name":"test_param",
"paramIn-0-cn":"测试参数",
"paramIn-0-type":"字符串",
"paramIn-0-map":"testParam",
"paramIn-0-isRequired":"1",
"paramIn-0-defaultVal":"测试成功",
// 第二行
"paramIn-1-name":"test_param2",
"paramIn-1-cn":"测试参数2",
"paramIn-1-type":"日期",
"paramIn-1-map":"testParam2",
"paramIn-1-isRequired":"0",
"paramIn-1-defaultVal":"测试失败",
// ... 还有很多行
// 动态的输出参数【跟输入参数一样,这里不再贴出】
}

后端处理

// 进行分组【这里过滤了输入参数paramIn 和输出参数 paramOut 进行分组处理】
// paramIn-000-name 分组key为 paramIn-000
Map<String, List<Map.Entry<String, Object>>> paramIn = mapParam.entrySet().stream().filter(map -> map.getKey().contains("paramIn")).collect(Collectors.groupingBy(map -> {
            String key = map.getKey();
            return key.substring(0, key.indexOf("-", 8));
        }));
// paramOut-000-name 分组key为 paramOut-000 
Map<String, List<Map.Entry<String, Object>>> paramOut = mapParam.entrySet().stream().filter(map -> map.getKey().contains("paramOut")).collect(Collectors.groupingBy(map -> {
            String key = map.getKey();
            return key.substring(0, key.indexOf("-", 9));
        }));
// 封装
ArrayList<SpecialConfigParaIn> paraInArrayList = new ArrayList<>();
paramIn.forEach((key, val) -> {
  // 这里实现了key值的处理,使其与entity的字段对应
  Map<String, Object> stringObjectMap = changeKeysToEntity(val, key);
  SpecialConfigParaIn specialConfigParaIn = JSON.parseObject(JSON.toJSONString(stringObjectMap), SpecialConfigParaIn.class);
            paraInArrayList.add(specialConfigParaIn);
        });
        specialConfig.setParamIn(JSON.toJSONString(paraInArrayList));
/**
* 处理所有key值
*
* @param mapList    需要处理所有key值的对象
* @param replaceStr 要替换的字符串
* @return Map<String, Object>
*/
private Map<String, Object> changeKeysToEntity(List<Map.Entry<String, Object>> mapList, String replaceStr) {
        Map<String, Object> returnMap = new HashMap<>(8);
        mapList.forEach(map -> {
            returnMap.put(map.getKey().replace(replaceStr, "").replace("-", ""), map.getValue());
        });
        return returnMap;
    }

总结

如果前端可以进行处理自然是最佳的,前端无法处理,在后端解决问题也不是不行。

目录
相关文章
|
供应链 JavaScript 前端开发
深入理解 ECMAScript 2024 新特性:Map.groupBy() 分组操作
ECMAScript 2024 (ES15) 引入了 `Map.groupBy()`,极大简化了数据分组操作。该方法从可迭代对象创建一个 `Map`,根据回调函数生成的键进行分组。适用于按条件、属性或复杂键分组,代码更简洁优雅。相比 `reduce`,它提供了更高的性能和更好的可读性,适合处理大量数据。通过详细案例展示,本文深入剖析了 `Map.groupBy()` 的强大功能及其应用场景。
210 11
ES6中map对象的使用,确实比Object好使哈
ES6中Map对象的使用优势,包括任意类型作为键、直接获取大小、增删查改操作等。Map的键可以是函数、对象、NaN等,支持forEach循环和for...of循环。
198 1
ES6中map对象的使用,确实比Object好使哈
|
存储 Java API
Java交换map的key和value值
通过本文介绍的几种方法,可以在Java中实现Map键值对的交换。每种方法都有其优缺点,具体选择哪种方法应根据实际需求和场景决定。对于简单的键值对交换,可以使用简单遍历法或Java 8的Stream API;对于需要处理值不唯一的情况,可以使用集合存储或Guava的Multimap。希望本文对您理解和实现Java中的Map键值对交换有所帮助。
363 1
|
缓存 前端开发 Java
【前端学java】java基础巩固复习巩固语法练习-工具类的封装(14)
【8月更文挑战第10天】java基础巩固,工具类的封装
126 1
【前端学java】java基础巩固复习巩固语法练习-工具类的封装(14)
|
JSON 前端开发 数据格式
@RequestMapping运用举例(有源码) 前后端如何传递参数?后端如何接收前端传过来的参数,传递单个参数,多个参数,对象,数组/集合(有源码)
文章详细讲解了在SpringMVC中如何使用`@RequestMapping`进行路由映射,并介绍了前后端参数传递的多种方式,包括传递单个参数、多个参数、对象、数组、集合以及JSON数据,并且涵盖了参数重命名和从URL中获取参数的方法。
1469 1
@RequestMapping运用举例(有源码) 前后端如何传递参数?后端如何接收前端传过来的参数,传递单个参数,多个参数,对象,数组/集合(有源码)
|
Java Go PHP
Java分组匹配
Java分组匹配
133 5
|
算法 Java
【Java集合类面试十八】、ConcurrentHashMap是怎么分段分组的?
ConcurrentHashMap通过分段锁(Segment)实现高效并发访问,get操作无需加锁,而put操作首先判断是否需要扩容,然后通过两次hash定位并尝试使用CAS和锁机制安全地添加元素。
|
开发框架 前端开发 JavaScript
循序渐进VUE+Element 前端应用开发(13)--- 前端API接口的封装处理
循序渐进VUE+Element 前端应用开发(13)--- 前端API接口的封装处理
|
存储 Java API
探讨Java中交换Map的Key和Value值的技术
探讨Java中交换Map的Key和Value值的技术
328 2
|
前端开发 JavaScript 开发者
前端 JS 经典:通用性函数封装思路
前端 JS 经典:通用性函数封装思路
149 0