Я считаю, что-то вроде этого должно работать:
Map<String,List<String>> map =
userList.stream()
.flatMap(user -> {
Map<String,String> um = new HashMap<>();
um.put("names",user.getName());
um.put("age",user.getAge());
um.put("org",user.getOrg());
return um.entrySet().stream();
}) // produces a Stream<Map.Entry<String,String>>
.collect(Collectors.groupingBy(Map.Entry::getKey,
Collectors.mapping(Map.Entry::getValue,
Collectors.toList())));
Он преобразует каждый User
в Map<String,String>
(содержащий 3 обязательных свойства, проиндексированных необходимыми ключами), а затем группирует записи всех пользовательских карт по их ключам.
EDIT:
Вот еще одна альтернатива, которая создает Map.Entry
s напрямую вместо создания маленьких HashMap
s, поэтому она должна быть более эффективной:
Map<String,List<String>> map =
userList.stream()
.flatMap (user -> Stream.of (new SimpleEntry<>("names",user.getName()),
new SimpleEntry<>("age",user.getAge()),
new SimpleEntry<>("org",user.getOrg())))
.collect(Collectors.groupingBy(Map.Entry::getKey,
Collectors.mapping(Map.Entry::getValue,
Collectors.toList())));