Для сравнения, это циклическое решение:
Map<String, Collection<Thing>> newMap = new HashMap<>();
for(Map<String, Thing> m: oldCollection)
m.forEach((s,t) -> newMap.computeIfAbsent(s, x->new ArrayList<>()).add(t));
Вы можете выразить ту же логику, что и операция Stream:
Map<String, Collection<Thing>> newMap = oldCollection
.stream()
.collect(HashMap::new,
(r,m)->m.forEach((s,t)->r.computeIfAbsent(s,x->new ArrayList<>()).add(t)),
(r,m)->m.forEach((s,l)->r.computeIfAbsent(s,x->new ArrayList<>()).addAll(l)));
Это то же самое, что и другое решение, кромечто логика flatMap
была интегрирована в коллектор.