Как преобразовать ключ в верхний регистр при использовании потоков java 8?

  • Есть список сотрудников Employee с 2-мя строковыми полями (имя + компания, где работает сотрудник).
  • Сгруппировать сотрудников по компании в Map структуру, но сделать компании капсом.
  • Понадобится:
    • Stream::collect
    • Collectors.groupingBy
    • Лямбда функция как первый аргумент groupingBy
    • String::toUpperCase
public static Map<String, List<Employee>> groupByCompaniesAsListUppercase(Collection<Employee> employees) {
    return employees.stream()
        .collect(Collectors.groupingBy(Employee::getCompany))
        .keySet().stream()
        .collect(Collectors.toMap(String::toUpperCase, s -> emptyList()));
}

Требуется вывод: {GOOGLE=[tasks.Task3_GroupBy$Employee@1d2adfbe, tasks.Task3_GroupBy$Employee@36902638], MICROSOFT=[tasks.Task3_GroupBy$Employee@223d2c72]}

Мой вывод {MICROSOFT=[], GOOGLE=[]}

Сама задача по ссылке задача task3: https://github.com/lislon/streams-assignments


Ответы (1 шт):

Автор решения: Alex Rudenko

Двойной проход с использованием Collectors.groupingBy и Collectors.toMap выглядит излишним, задачу можно горазо проще решить при одном проходе:

public static Map<String, List<Employee>> groupByCompaniesAsListUppercase(Collection<Employee> employees) {
    return employees.stream()
           .collect(Collectors.groupingBy(emp -> emp.getCompany().toUpperCase()));
}
→ Ссылка