使用流

时间:2018-04-05 00:05:07

标签: java arrays set java-stream

使用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]

谢谢

2 个答案:

答案 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)));

    // .....
}