Страницы

Поиск по вопросам

пятница, 26 октября 2018 г.

Преобразование Map в список пар с использованием Stream

Имеем:
Map> map = fillMap();
Необходимо максимально элегантно преобразовать его в List> используя Stream API (Pair из apache lang3).
Например, было:
[ a=[obj1,obj2,obj3], b=[obj4,obj5], c=[obj6,obj7] ]
хочу получить:
[ Pair{a,obj1}, Pair{a,obj2}, Pair{a,obj3}, Pair{b,obj4}, Pair{b,obj5}, Pair{c,obj6}, Pair{c,obj7} ]


Ответ

Можно с помощью операции flatMap (вместо Pair - AbstractMap.SimpleEntry), она принимает функцию, возвращающую Stream и встраивает элементы возвращенного потока в основной:
Map> map = new HashMap<>();
map.put( "a", Arrays.asList( "obj1", "obj2", "obj3" ) ); map.put( "b", Arrays.asList( "obj4", "obj5" ) ); map.put( "c", Arrays.asList( "obj6", "obj7" ) );
System.out.println( map );
List> list = map.entrySet().stream().flatMap( entry -> entry.getValue().stream() .map( listElement -> new AbstractMap.SimpleEntry<>( entry.getKey(), listElement ) ) ).collect( Collectors.toList() );
System.out.println( list );

Комментариев нет:

Отправить комментарий