Java 对list 进行group

本文介绍如何在Java编程中,利用StreamAPI的collect和groupingBy方法,避免for循环直接处理List,将数据暂存Map中,从而简化代码实现更高的编程效率。

 不需要通过for 循环对List进行判断,暂存在map,让coding更加simple。

Map<String,List<Item>> invMap = 
inst.stream().collect(Collectors.groupingBy(Inm::getncy));

first Group   then     counting 统计数量

list.stream().collect(Collectors.
groupingBy(item->item.getIhInvNo(),Collectors.counting())).
forEach((key,value)->{
			System.out.println(key);
			System.out.println(value);
});;


结果:


1
S2400002951
3
S400002952
3

Group  --> Map ---> value 降序

Java中对 `List` 进行校验通常涉及到使用 **Bean Validation** 规范(如 `javax.validation`),尤其是在 Spring 框架中进行请求参数校验时非常常见。Bean Validation 支持对集合类型(如 `List`)中的元素进行约束,确保每个元素都满足特定的验证规则。 ### 对 List 进行校验的方式 1. **直接在实体类中定义 List 类型字段并添加约束注解** 可以在实体类中声明一个 `List` 类型的字段,并为该字段加上 `@Valid` 注解(来自 `javax.validation`)。这样在进行嵌套对象校验时,验证框架会自动递归地校验集合中的每个元素。 示例代码如下: ```java public class UserGroup { @Valid private List<@NotNull(message = "User cannot be null") User> users; // Getter and Setter } ``` 上述代码中,`users` 字段是一个 `List<User>` 类型,其中每个 `User` 实例都会被校验是否为 `null`。如果 `users` 列表中存在 `null` 元素,则会触发错误,并返回指定的消息。 2. **在 Controller 中对 List 类型的请求参数进行校验** 在 Spring MVC 的控制器中,可以直接将 `@Valid` 用于方法参数中的 `List` 类型。例如: ```java @PostMapping("/users") public ResponseEntity<?> createUser(@RequestBody @Valid List<@Size(min = 2, max = 30, message = "Name must be between 2 and 30 characters") String> names) { // 处理逻辑 return ResponseEntity.ok().build(); } ``` 在这个例子中,每个 `String` 元素都会被校验其长度是否在 2 到 30 之间。如果某个元素不符合要求,则会抛出 `MethodArgumentNotValidException`。 3. **使用 `@Valid` 注解对嵌套对象列表进行校验** 如果 `List` 中包含的是复杂的对象类型,可以在每个对象内部添加约束规则,然后在包含该 `List` 的父对象上使用 `@Valid` 注解。 示例: ```java public class User { @NotBlank(message = "Name is required") private String name; @Email(message = "Invalid email format") private String email; // Getter and Setter } public class UserGroup { @Valid private List<User> users; // Getter and Setter } ``` 在这种情况下,Spring 会自动校验 `users` 列表中的每个 `User` 实例,并返回所有不符合条件的错误信息。 4. **自定义约束注解对 List 进行校验** 如果需要对 `List` 执行更复杂的校验逻辑(例如确保列表中没有重复元素、元素总数符合要求等),可以通过创建自定义约束注解和验证器来实现。 示例:创建一个自定义注解 `@UniqueElements`,确保 `List` 中的元素唯一: ```java @Documented @Constraint(validatedBy = UniqueElementsValidator.class) @Target({ ElementType.FIELD }) @Retention(RetentionPolicy.RUNTIME) public @interface UniqueElements { String message() default "List contains duplicate elements"; Class<?>[] groups() default {}; Class<? extends Payload>[] payload() default {}; } ``` 然后实现验证器类: ```java public class UniqueElementsValidator implements ConstraintValidator<UniqueElements, List<String>> { @Override public boolean isValid(List<String> value, ConstraintValidatorContext context) { if (value == null) { return true; } Set<String> uniqueSet = new HashSet<>(value); return uniqueSet.size() == value.size(); } } ``` 最后在实体类中使用该注解: ```java public class UserGroup { @UniqueElements(message = "User names must be unique") private List<String> userNames; // Getter and Setter } ``` ### 配置 Validator 在 Spring 中,需要确保 `Validator` 被正确配置,以便在请求处理过程中自动触发校验逻辑。可以通过以下方式配置 `Validator`: ```java @Configuration public class ValidationConfig implements WebMvcConfigurer { @Override public void configureValidator(ValidatorRegistry registry) { registry.addValidator(new UserGroupValidator()); } } ``` 此外,还可以使用 `LocalValidatorFactoryBean` 显式声明一个 `Validator` Bean: ```java @Bean public Validator validator() { return new LocalValidatorFactoryBean(); } ``` ### 异常处理 在实际应用中,建议使用 `@ControllerAdvice` 或 `@RestControllerAdvice` 来统一处理校验失败时抛出的异常。例如: ```java @RestControllerAdvice public class ValidationExceptionHandler { @ExceptionHandler(MethodArgumentNotValidException.class) public ResponseEntity<Map<String, String>> handleValidationExceptions(MethodArgumentNotValidException ex) { Map<String, String> errors = new HashMap<>(); ex.getBindingResult().getAllErrors().forEach(error -> { String fieldName = ((FieldError) error).getField(); String errorMessage = error.getDefaultMessage(); errors.put(fieldName, errorMessage); }); return new ResponseEntity<>(errors, HttpStatus.BAD_REQUEST); } } ``` ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值