如何在Java 8中过滤作为Map条目值的列表?

时间:2019-01-25 04:42:36

标签: java-8 collectors

我有一个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);

现在,我想遍历地图的entrySet并制作一个新地图,该地图具有包含元素的列表,该元素是该条目的键的倍数。即输出应如下所示:

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

过滤谓词使用映射条目键值来测试列表元素。在不修改原始地图的情况下如何实现?

2 个答案:

答案 0 :(得分:4)

这是解决问题的一种方法,方法是流式传输原始地图中的条目,然后使用键和过滤后的列表创建新地图:

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())));

答案 1 :(得分:2)

分两步进行操作可能会使它更具可读性:

openButton.setAccessKey('p');