Как отфильтровать список, который является значением записи карты в Java 8? - PullRequest
0 голосов
/ 25 января 2019

У меня есть Map<B, List<A>>. Я хочу отфильтровать некоторое A на основе некоторого предиката, который опирается на ключ записи карты типа B. Например, вот моя структура данных:

List<Integer> list1 = Arrays.asList(5,2,3,4);
List<Integer> list2 = Arrays.asList(5,6,7,8);
List<Integer> list3 = Arrays.asList(9,10,11,12,13);
List<Integer> list4 = Arrays.asList(11,23,112);
Map<Long, List<Integer>> map = new HashMap<>();
map.putIfAbsent(2L, list1);
map.putIfAbsent(3L, list2);
map.putIfAbsent(4L, list3);
map.putIfAbsent(5L, list4);

Теперь я хочу перебрать набор записей карты и создать новую карту, имеющую список, содержащий элементы, кратные ключу этой записи. т.е. результат должен выглядеть следующим образом:

2L --> List of (2, 4)
3L --> List of (6)
4L --> List of (12)
5L --> empty List

Предикат фильтрации использует значение ключа записи карты для проверки элементов списка. Как я могу добиться этого без изменения исходной карты?

Ответы [ 2 ]

0 голосов
/ 25 января 2019

Выполнение в два этапа может сделать его более читабельным:

    //create a new map
    Map<Long, List<Integer>> newMap = new HashMap<>();
    //add filtered entries to it
    map.entrySet().forEach(
                           e ->newMap.put( e.getKey(),e.getValue()
                                                       .stream()
                                                       .filter(value -> value % e.getKey() == 0)
                                                       .collect(Collectors.toList()))
                           );                               
0 голосов
/ 25 января 2019

Вот один из способов решения проблемы: потоковая передача записей на исходной карте и создание новой карты с ключами и отфильтрованными списками:

Map<Long, List<Integer>> newMap = map.entrySet().stream()
        .collect(Collectors.toMap(Map.Entry::getKey, entry -> entry.getValue().stream()
                .filter(value -> value % entry.getKey() == 0)
                .collect(Collectors.toList())));
...