Как подать заявку в функцииаргумент из списка (не список) - PullRequest
0 голосов
/ 03 марта 2019

У меня есть метод, который возвращает компанию в качестве ключа и список сотрудников в качестве значений <T> Map<String, List<T>> getUserPerCompany(final Function<User, T> converter).Метод принимает параметр converter, который в тестах возвращает строку (имя + фамилия сотрудника).Должно вернуть: Map<String, List<String>>.Я создал эту реализацию:

return getUserStream().collect(toMap(Company::getName, c -> converter.apply(c.getUsers())));

Ошибка: apply (domain.User) in Function cannot be applied to (java.util.List<domain.User>)

Моя проблема заключается в том, что я не знаю, как передать сотрудника на «применение»список вместо списка полностью.

Мои другие попытки:

  • return getUserStream().collect(toMap(Company::getName, c -> converter.apply((User) c.getUsers().listIterator())));
  • return getUserStream().collect(toMap(Company::getName, c -> converter.apply((User) c.getUsers().subList(0, c.getUsers().size()))));
  • return getUserStream().collect(toMap(Company::getName, c -> converter.apply((User) c.getUsers().iterator())));

Ответы [ 2 ]

0 голосов
/ 03 марта 2019

Вы можете использовать Collectors.groupingBy() и написать пользовательский Collector:

<T> Map<String, List<T>> getUserPerCompany(final Function<User, T> converter) {
    return getUserStream().collect(
            Collectors.groupingBy(
                    c -> c.getName(),
                    Collector.of(
                            ArrayList::new,                  //init accumulator
                            (list, c)-> c.getUsers()         //processing each element
                                         .stream()
                                         .map(converter)
                                         .forEach(list::add),
                            (result1, result2) -> {          //confluence 2 accumulators 
                                result1.addAll(result2);     //in parallel execution
                                return result1;
                            }
                    )
            )
    ); 
}
0 голосов
/ 03 марта 2019

Полагаю, это то, что вы ищете

<T> Map<String, List<T>> getUserPerCompany(final Function<User, T> converter) {
    return getUserStream().collect(Collectors.toMap(
            c -> c.getName(),
            c -> c.getUsers()
                  .stream()
                  .map(converter)
                  .collect(Collectors.toList())
    ));
}

Пример использования

final Map<String, List<String>> users = getUserPerCompany(user -> user.getName() + " " + user.getSurname());

В основном вам нужно map каждый User, применяя ввод Function.

...