2016-01-25 3 views
2

У меня есть карта представляет собой карту в список значений, но мне нужно, чтобы инвертировать его так, чтобыJava 8 новообращенный Map <Integer, Список <String>> к карте <String, List <Integer>> с

Map<Integer, List<String>> 

становится

Map<String, List<Integer>> 

Например, у меня есть

1 -> { A, B, C } 
2 -> { B } 
3 -> { A, C } 

, и я хочу видеть

A -> { 1, 3 } 
B -> { 1, 2 } 
C -> { 1, 3 } 

Есть ли более простой способ в Java 8 сделать это, чем выполнять итерацию записей в карте и создать запись набора, если она не существует, и добавить в список и т. Д.? Я продолжаю думать, что это действительно очевидно, но я не могу это решить.

Заранее спасибо

+1

Вероятно, DUP, конечно, но это обеспечивает хорошее обновление Java 8 к указанному вопросу. Может быть, наш уважаемый г-н Вассерман хотел бы дать ответ на связанный друг? –

+2

@ ErickG.Hagstrom У меня уже есть ответ на этот вопрос;) Я полагаю, я мог бы отредактировать его, чтобы добавить еще –

+0

Спасибо за указатели на дубликат - это было главным образом, что я был настроен заставить его работать с Java 8 и ответить ниже установлено требование. – ismoore999

ответ

8

проверялось, но вы могли бы сделать что-то вроде этого:

mapIntToStrings.entrySet().stream() 
    .flatMap(entryIntToStrings -> entryIntToStrings.getValue().stream() 
     .map(str -> new AbstractMap.SimpleEntry<>(entryIntToStrings.getKey(), str))) 
    .collect(groupingBy(Map.Entry::getValue, mapping(Map.Entry::getKey, toList()))) 
+0

Что такое 'entryIntToStrings'? – Andreas

+1

@ Андреас возглавляет, исправлено, это был аргумент лямбда. –

+1

Это был бы хороший ответ на связанный вопрос. Просто говорю'. :-) –

Смежные вопросы