使用Stream API转换此循环需要一些帮助:
protected ResponseEntity<Object> handleMethodArgumentNotValid( MethodArgumentNotValidException ex,
HttpHeaders headers, HttpStatus status, WebRequest request ) {
Map<String, Set<String>> fieldErrorWithMessages = new HashMap<String, Set<String>>();
List<FieldError> fieldErrors = ex.getBindingResult().getFieldErrors();
Set<String> messages;
for ( FieldError error : fieldErrors ) {
String currentField = error.getField();
String currentErrorMessage = message.getMessage( error.getCodes()[0], null, locale );
if ( !fieldErrorWithMessages.containsKey( currentField ) ) {
messages = new HashSet<String>();
messages.add( currentErrorMessage );
fieldErrorWithMessages.put( currentField, messages );
} else {
if ( !fieldErrorWithMessages.get( currentField ).contains( currentErrorMessage ) ) {
fieldErrorWithMessages.get( currentField ).add( currentErrorMessage );
}
}
}
.....
}
目标是将每个字段分组及其错误消息。错误消息存储在message.properties
文件中。此代码按预期工作,但我想知道我是否可以使用Stream API使其更简洁。类似的东西:
Map<String, Set<String>> fieldErrorWithMessages =fieldErrors.stream().collect( Collectors.groupingBy( FieldError::getField,/*something returnig a set of messages stored in messages.properties for each field*/ ) );
请注意,要检索邮件,请使用FieldError.getCodes()
的第一个代码,请参见上文:error.getCodes()[0]
谢谢
答案 0 :(得分:3)
实际上有很大的空间来减少没有溪流,但我会切入追逐:
System.Numerics.Vectors
答案 1 :(得分:0)
这是@shmosel's answer的补充。正如它在那里写的那样,在尝试使用流之前,可以显着改进原始代码。这是一种方式:
protected ResponseEntity<Object> handleMethodArgumentNotValid(
MethodArgumentNotValidException ex,
HttpHeaders headers,
HttpStatus status,
WebRequest request) {
Map<String, Set<String>> fieldErrorWithMessages = new HashMap<>();
ex.getBindingResult().getFieldErrors().forEach(error ->
fieldErrorWithMessages.computeIfAbsent(
error.getField(),
k -> new HashSet<>())
.add(message.getMessage(error.getCodes()[0], null, locale)));
// .....
}