Updating a nested list using a lambda expression: Java 8

I would like to update the list of objects inside another list using streams api.

I have List<User> usersone that has List<Filter> filters. I would like to update the elements corresponding to the user ID and the corresponding filterName, with the Filter object included as an argument. The map does not allow me to do this.

I tried doing below, but the map does not seem to allow multiple elements to be displayed.

public void update(String userID, Filter filter) {
        users.stream()
        .filter(element -> element.getUserId().equals(userID)
            && element.getFilters().stream().filter(f -> f.getName().equals(filter.getName())).findAny().isPresent())
        .forEach(x -> {
            x.getFilters().stream().map(s -> {
                s.setCreatedOn(filter.getCreatedOn());
                s.setDescription(filter.getDescription());
                s.setEnabled(filter.isEnabled());
                s.setFilterValue(filter.getFilterValue());
                s.setReadOnly(filter.isReadOnly());
                s.setModifiedOn(filter.getModifiedOn());
                s.setName(filter.getName());
                s.setType(filter.getType());
                s.setValid(filter.isValid());
                s.setEncrypted(filter.isEncrypted());
                });
        });
    }

What is the method that can be used to perform an internal update List<Filter>

+4
source share
1 answer

, map forEach x.getFilters().stream().map(, .

Stream<Filter> Filter, , :

public void update(String userID, Filter filter) {
    users.stream()
         .filter(element -> element.getUserId().equals(userID)) // get relevant user[s]
         .flatMap(element -> element.getFilters().stream()) // get all filters of relevant 
                                                            // user[s]
         .filter(f -> f.getName().equals(filter.getName())) // keep only relevant filters
         .forEach (f -> { // run your update on all the relevant filters
              f.setCreatedOn(filter.getCreatedOn());
              f.setDescription(filter.getDescription());
              f.setEnabled(filter.isEnabled());
              f.setFilterValue(filter.getFilterValue());
              f.setReadOnly(filter.isReadOnly());
              f.setModifiedOn(filter.getModifiedOn());
              // f.setName(filter.getName()); can be removed, as commented by markusk
              f.setType(filter.getType());
              f.setValid(filter.isValid());
              f.setEncrypted(filter.isEncrypted());
            });
}
+4

Source: https://habr.com/ru/post/1688854/


All Articles