Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Convert a foreach loop using stream

Need some helps to convert this loop using 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 );
             }
         }
 }
.....
}

The goal is to group each field with its error messages. The error messages are stored in a message.properties file. This code works as expected but I would like to know if I can make it more concise using Stream API. Something like :

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*/ ) );

Note that to retrieve the message I use the first code of FieldError.getCodes(), see above : error.getCodes()[0]

Thanks

like image 943
akuma8 Avatar asked Jan 21 '26 04:01

akuma8


1 Answers

There's actually significant room to cut that down without streams, but I'll cut to the chase:

Map<String, Set<String>> fieldErrorWithMessages = ex.getBindingResult()
        .getFieldErrors()
        .stream()
        .collect(Collectors.groupingBy(
                FieldError::getField,
                Collectors.mapping(
                        error -> message.getMessage(error.getCodes()[0], null, locale),
                        Collectors.toSet())));
like image 118
shmosel Avatar answered Jan 23 '26 21:01

shmosel



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!