Обновите список партиями, затем присоединитесь - PullRequest
2 голосов
/ 11 апреля 2019

Моя цель: обновить доступность списка сотрудников

List<Employee> employees = ...;

//separated to a List of "20 item list"
List<List<Employee>> separatedEmployees = ListUtils.partition(employees, 20); 

//update availability by each "20 item List"
separatedEmployees.parallelStream()
    .forEach(item -> updateAvailability(user, null, item)); 

//get back whole list
List<Employee> employeesAfterUpdate= separatedEmployees
    .stream()
    .flatMap(Collection::stream)
    .collect(Collectors.toList());

Работать совершенно нормально, но мне интересно, есть ли другая реализация / подход, для которого мне не нужно создавать буфер List<List<Employee>> separatedEmployees, потому что этомне трудно объяснить кому-то другому (мало технических знаний) о List из List

Ответы [ 2 ]

2 голосов
/ 11 апреля 2019

Прочитав принятый ответ , выясните, что я могу просто использовать элемент peek (вместо forEach), а затем собрать обратно в list всего за один stream

List<Employee> employees = ...;
List<Employee> employeesAfterUpdate = ListUtils.partition(employees, 20)
    .parallelStream()
    .peek(item -> updateAvailability(user, null, item))
    .flatMap(Collection::stream)
    .collect(Collectors.toList());
2 голосов
/ 11 апреля 2019

для этого можно использовать библиотеку StreamEx:

List<Employee> updatedEmployees = StreamEx.ofSubLists(employees, 20)
            .parallel()
            .map(items -> updateAvailability(user, null, items))
            .flatMap(List::stream)
            .collect(Collectors.toList());

Вы можете заменить map на peek, если updateAvailability вернет void, хотя peek только для отладки.Я бы предложил изменить updateAvailability, чтобы он возвращал новый или обновленный список

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...