Java 8 在Java8中,如何过滤作为映射项值的列表?

Java 8 在Java8中,如何过滤作为映射项值的列表?,java-8,collectors,Java 8,Collectors,我有一张地图。我想根据依赖于类型B的映射条目的键的某个谓词筛选出一些A。例如,下面是我的数据结构: 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.asL

我有一张
地图
。我想根据依赖于类型B的映射条目的键的某个谓词筛选出一些A。例如,下面是我的数据结构:

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

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

以下是解决此问题的一种方法,将原始地图中的条目流化,并使用键和过滤列表创建一个新地图:

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())));
Map newMap=Map.entrySet().stream()
.collect(Collectors.toMap(Map.Entry::getKey,Entry->Entry.getValue().stream())
.filter(值->值%entry.getKey()==0)
.collect(Collectors.toList());

分两步进行可能会使其更具可读性:

    //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()))
                           );                               
//创建一个新映射
Map newMap=newhashmap();
//向其中添加筛选的条目
map.entrySet().forEach(
e->newMap.put(e.getKey(),e.getValue())
.stream()
.filter(值->值%e.getKey()==0)
.collect(收集器.toList())
);                               
With:
EntryStream.of(map).flatMapValues(List::stream).filterKeyValue((k,v)->v%k==0).grouping()
您可以调用
forEach()
而不调用
stream()
    //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()))
                           );