Я не думаю, что collectMultiMap
или collectMap
поможет вам напрямую в этом случае:
Только collectMultiMap
(и его перегрузки) может вернуть Map<T, Collection<V>
, что явно отличается от того, что вы хотите. Конечно, вы можете обработать результирующий набор значений (а именно, часть карты Collection<V>
) со сложностью O (n).
С другой стороны, collectMap
(и его перегрузки) выглядят несколько более многообещающе, если вы предоставите функцию значения. Однако у вас нет доступа к другим V
объектам, что запрещает вам строить Collection<V>
.
Решение, которое я придумал, использует reduce
; хотя тип возвращаемого значения:
Mono<Map<String, Map<String, List<Response>>>>
(помните List<V>
вместо Collection<V>
)
return Flux.<Response>fromIterable( responses )
.reduce(new HashMap<>(), (map, user) -> {
map.getOrDefault(user.getId(), new HashMap<>())
.getOrDefault(user.getEmail(), new ArrayList<>())
.add(user);
return map;
});
Полный тип для HashMap
в reduce
равен HashMap<String, Map<String, List<AppUser>>>
, к счастью, Java может вывести его из возвращаемого типа метода или типа присвоенной переменной.