List使用Stream按一个字段排序、分页、多级排序

本文介绍了在实际应用中如何使用Java8的Stream API对包含Map的List进行排序、分页操作。特别强调了在排序时需注意Map中的数字字符串需转换为数值类型以确保正确排序,同时处理了Comparator可能出现的空指针异常,通过filter排除null元素。还展示了如何实现多级排序和利用stream进行切片分页的方法。

实际应用场景是接的实时数据,数据量大概有3600条,返回给客户端还需要进行排序、分页

  • 注意点:
  1. 对于map中的排序key对应的value如果是字符串类型的数字,需要转换成数字类型(如BigDecimal、Integer)再排序,对于字符串类型的数字,是达不到对数字排序的效果的(按照字符串的首个数字排序)
  2. Comparator.comparing(value),value不能为null,会报空指针异常,这里的处理是使用stream将null的map排出后再排序,将null的接到返回的List的后面
  3. 排序使用了java8 stream中的filter、sorted、切片分页方法
import java.math.BigDecimal;
import java.util.*;
import java.util.stream.Collectors;

public class SortUtil {
    private final static String SORT_TYPE = "desc";

    public static List<Map<String, Object>> sortStock(String keyWord,String sortType,
                                                      List<Map<String, Object>> stockList){
        List<Map<String, Object>> collect = new ArrayList<>();
        List<Map<String, Object>> subList1;
        List<Map<String, Object>> subList2;
        switch (keyWord){
            case "name":
                if (SORT_TYPE.equals(sortType)){
                    collect = stockList.stream()
                        .sorted(Comparator.comparing(SortUtil::getName).reversed())
                        .collect(Collectors.toList());
                }else {
                    collect = stockList.str
<think>嗯,用户的问题是关于如何处理前端传递的表格数据。首先,我需要理解用户的具体需求。他们可能在前端接收了表格数据,比如来自表单提交或者文件上传,然后需要将这些数据传递到后端进行处理。常见的情况包括数据验证、清洗、转换格式,或者存储到数据库。 接下来,根据提供的引用,特别是引用[4]和引用[5],用户可能涉及到与后端框架如SpringBoot和MyBatisPlus的集成。引用[4]提到了通过AJAX发送数据到后端,引用[5]讨论了处理后端返回的数据并动态合并单元格,这说明用户可能需要处理数据的接收、处理以及存储的整个流程。 首先,数据接收部分。用户可能使用表单提交或者AJAX请求。如果是AJAX,数据可能以JSON格式传递,需要在后端正确解析。例如,使用SpringBoot的@RequestBody注解来接收JSON数据。这时候需要注意数据格式的正确性,以及可能的异常处理,比如数据格式错误或缺失字段。 然后是数据验证和清洗。确保前端传来的数据符合业务规则,比如必填字段、数据类型、范围限制等。例如,日期格式是否正确,数字是否在合理范围内。这里可能需要使用校验框架,如Hibernate Validator,或者在代码中手动检查。引用[1]提到后端预处理数据,可能包括验证步骤,避免无效数据进入系统。 数据转换和格式化也很重要。比如日期字符串转换为Date对象,或者将字符串数字转为整数。此外,可能需要处理嵌套结构,比如多级对象或数组,这时候需要正确的反序列化。引用[5]提到处理一对多结构的数据,可能需要拆分或合并单元格,这在前端展示时处理,但后端可能需要存储为多个条目。 存储到数据库时,使用ORM框架如MyBatisPlus可以简化操作。需要确保实体类与数据库表正确映射,处理事务以保证数据一致性。例如,批量插入数据时使用事务,避免部分失败导致的数据不一致。引用[3]中的分片处理思想也可以应用到后端,分批处理大量数据以提高性能。 外,用户可能需要处理分页或大数据量的情况。引用[2]和引用[3]提到了前端分页和后端预处理,减少前端计算量。如果用户传递的数据量很大,后端可能需要优化处理逻辑,比如分批处理、异步处理,或者使用缓存机制。 异常处理也是关键部分。比如,捕获数据解析异常、数据库操作异常,并返回友好的错误信息给前端。同时,记录日志以便排查问题。 最后,测试和验证。确保处理流程的每个步骤都经过测试,包括单元测试和集成测试,验证数据处理的正确性和性能。 可能用户没有明确提到的点包括数据的安全性,比如防止SQL注入或XSS攻击,需要在数据处理时进行适当的过滤和转义。此外,数据隐私问题,如敏感信息的加密存储,也可能需要考虑。 总结下来,处理前端传来的表格数据需要关注数据接收、验证、转换、存储以及异常处理,同时结合业务需求进行优化,如分页、分批处理,并确保安全性和性能。</think>### 处理前端传递的表格数据的步骤 #### 1. **数据接收与解析** - **接收方式**:通过表单提交或 AJAX 请求(如 `application/json` 格式)传递数据[^4]。 - **解析方法**: - **表单数据**:使用框架(如 Spring Boot)的 `@RequestParam` 或 `@ModelAttribute` 接收。 - **JSON 数据**:使用 `@RequestBody` 注解反序列化为对象或集合,例如: ```java @PostMapping("/save") public ResponseEntity<?> saveData(@RequestBody List<TableData> dataList) { // 处理逻辑 } ``` #### 2. **数据验证** - **基础验证**:检查必填字段、数据类型(如数字、日期)、长度限制等。 - **业务规则验证**:例如日期范围、唯一性约束(如避免重复数据)。 - **工具支持**:使用校验框架(如 Hibernate Validator)简化验证: ```java public class TableData { @NotBlank(message = "名称不能为空") private String name; @Min(value = 0, message = "数值必须大于等于0") private Integer value; } ``` #### 3. **数据清洗与转换** - **格式转换**:将前端传递的字符串转为后端需要的类型(如日期字符串转为 `LocalDateTime`)。 - **结构处理**:若数据包含嵌套或一对多关系(如合并单元格数据),需拆分为独立实体[^5]。 ```java // 示例:将嵌套的 JSON 数组转换为实体列表 List<Detail> details = data.getDetails().stream() .map(dto -> new Detail(dto.getField1(), dto.getField2())) .collect(Collectors.toList()); ``` #### 4. **数据存储** - **数据库操作**:使用 MyBatis Plus 的 `saveBatch()` 实现批量插入[^4]。 - **事务管理**:添加 `@Transactional` 注解保证原子性。 ```java @Transactional public void batchSave(List<TableData> dataList) { myMapper.insertBatch(dataList); // 自定义批量插入方法 } ``` #### 5. **性能优化** - **分批次处理**:若数据量过大(如超过 1 万条),按分片处理避免内存溢出[^3]。 ```java int batchSize = 1000; List<List<TableData>> chunks = ListUtils.partition(dataList, batchSize); chunks.forEach(chunk -> myMapper.insertBatch(chunk)); ``` - **异步处理**:对耗时操作(如文件生成)使用 `@Async` 注解异步执行。 #### 6. **异常处理** - **全局异常捕获**:通过 `@ControllerAdvice` 返回统一错误格式。 ```java @ExceptionHandler(MethodArgumentNotValidException.class) public ResponseEntity<?> handleValidationException(MethodArgumentNotValidException ex) { // 提取校验错误信息并返回 } ``` #### 7. **数据回显与反馈** - **返回处理结果**:包含成功条数、失败原因等。 - **前端渲染**:若需动态合并单元格,返回标记字段(如 `rowspan`)供前端解析[^5]。 --- ### 示例代码(Spring Boot + MyBatis Plus) ```java // 控制层 @RestController public class DataController { @Autowired private DataService dataService; @PostMapping("/upload") public ResponseEntity<?> uploadData(@RequestBody List<TableDataDTO> dtos) { List<TableData> entities = dtos.stream() .map(dto -> new TableData(dto.getName(), dto.getValue())) .collect(Collectors.toList()); int savedCount = dataService.batchProcess(entities); return ResponseEntity.ok(Map.of("message", "成功保存 " + savedCount + " 条数据")); } } // 服务层 @Service public class DataService { @Autowired private TableDataMapper tableDataMapper; @Transactional public int batchProcess(List<TableData> dataList) { return tableDataMapper.insertBatch(dataList); } } ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值