请求协助将Spring参数校验异常处理中的foreach循环转为Stream API
用Java Stream API替代Spring参数校验异常处理中的foreach循环
嘿,这事儿不难!我来帮你把这段处理参数校验异常的foreach循环转换成更简洁的Stream API实现,逻辑和原来完全一致,但代码可读性和简洁度会提升不少。
先给你完整的转换后的方法代码:
protected ResponseEntity<Object> handleMethodArgumentNotValid(MethodArgumentNotValidException ex, HttpHeaders headers, HttpStatus status, WebRequest request) { // 用Stream API替代foreach,自动分组收集字段对应的错误消息集合 Map<String, Set<String>> fieldErrorWithMessages = ex.getBindingResult().getFieldErrors() .stream() .collect(Collectors.groupingBy( FieldError::getField, // 按字段名分组作为Map的key Collectors.mapping(FieldError::getDefaultMessage, Collectors.toSet()) // 把错误消息收集成Set作为value )); // 这里可以继续添加你原本的后续处理逻辑,比如构造响应体返回 return new ResponseEntity<>(fieldErrorWithMessages, headers, status); }
关键逻辑解释:
- 首先通过
ex.getBindingResult().getFieldErrors()拿到所有字段错误的列表,调用.stream()转换成Stream流 Collectors.groupingBy(FieldError::getField):负责按字段名进行分组,自动把相同字段名的错误归到同一个key下- 第二个参数是下游收集器:
Collectors.mapping(FieldError::getDefaultMessage, Collectors.toSet()),它会把每个FieldError转换成对应的错误消息字符串,然后收集成一个Set(避免重复的错误消息),作为Map中对应key的value
这样就完全替代了原来需要手动判断Map中是否存在字段、新建Set再添加消息的foreach逻辑,Stream API会帮你自动完成所有分组和收集操作。
内容的提问来源于stack exchange,提问作者akuma8
相关产品推荐
相关产品推荐

