Использование потоков здесь может быть не таким уж тривиальным или даже необходимым. В основном вам нужно сначала отобразить X, Y и Z на кортежи, а затем реконструировать «перевернутую» карту дальше вниз по течению. Это не будет слишком сложно сделать, но, вероятно, не облегчит чтение или повышение производительности.
Вместо этого вы можете сделать что-то вроде следующего, чтобы использовать лямбда-выражения, а также интерфейсы функций:
<X, Y, Z> Map<Y, Map<X, Z>> invert(Map<X, Map<Y, Z>> map) {
//create a target map
Map<Y, Map<X, Z>> target = new HashMap<>();
//loop over the outer and inner entry sets
map.entrySet().forEach(outer -> outer.getValue().entrySet().forEach(
//put the entries into the target map as needed while creating new nested maps as needed
inner -> target.computeIfAbsent(inner.getKey(), k -> new HashMap<>() )
.put(outer.getKey(), inner.getValue())
));
return target;
}