Lambda Java8-从映射中筛选值列表的方法?

Lambda Java8-从映射中筛选值列表的方法?,lambda,java-8,java-stream,Lambda,Java 8,Java Stream,我有一张地图 Map<Integer, List<Person>> personsById 我需要根据谓词过滤映射,我得到了下面的代码,它不会修改列表 map.entrySet().stream() .filter(entry -> entry.getValue().stream().anyMatch(predicate)) .collect(Collectors.toMap(Map.Entry::getKey,Map.Entry::getValue)) 然而,

我有一张地图

Map<Integer, List<Person>> personsById
我需要根据谓词过滤映射,我得到了下面的代码,它不会修改列表

map.entrySet().stream()
.filter(entry -> entry.getValue().stream().anyMatch(predicate))
.collect(Collectors.toMap(Map.Entry::getKey,Map.Entry::getValue))
然而,上面的代码实际上并没有过滤列表 分机:
{id:100,[{personID:100},{personID:50},{personID:2}]
我仍然可以在列表中看到e
personID:2
。是否有方法可以修改列表中的值以返回过滤后的列表或人员?java 8中的任何指针都将非常有用

注意:请忽略我输入的代码中的任何打字错误

编辑:我得到了答案

map.entrySet()
                .stream()
                .collect(Collectors.toMap(Map.Entry::getKey,
                        entry -> entry.getValue().stream().filter(predicate).collect(Collectors.toList())))

我发现下面的方法对我很有效。欢迎任何更好的解决方案发布回复,并说明为什么更好。目前,如果没有找到匹配项,此代码返回一个带有空列表的映射键(如果您有一个解决方案,可以从结果中删除键,并且在没有匹配项时返回null,这也很好)


如果您不关心自己的初始映射,则可以使用以下代码段,该代码段对映射中存储的值进行迭代,然后检查列表中的某个项在未填充谓词时是否需要删除:

map.values().forEach(list -> list.removeIf(predicate.negate()));
但我必须提到的是,这只适用于可变列表。对于可变列表,在运行时会抛出未经检查的
UnsupportedOperationException

文件:


我想我找到了答案.map..entrySet().stream().collect(Collectors.toMap(map.Entry::getKey,Entry->Entry.getValue().stream().filter(谓词).collector(Collectors.toList()))然后在答案部分发布你的答案并接受它:)你最初的方法不正确的原因是->
.filter(entry->entry.getValue().stream().anyMatch(predicate))
你的基本意思是“给定一个映射条目,从条目值创建一个流(本例中的列表)然后,如果列表中的任何人与提供的谓词匹配,则保留整个条目“。因此,我们得到了意外的结果。如果谓词过滤掉列表中的所有元素,会发生什么情况?是否可以保留以空列表作为值的条目?或者是否也要从映射中过滤掉该条目?目前,我可以保留带有空结果的映射键,但我希望看到另一个答案n筛选键,当没有匹配项时,结果为null。如果您有更好的解决方案,请帮助我。
             map.entrySet()
                .stream()
                .collect(Collectors.toMap(Map.Entry::getKey,
                  entry -> entry.getValue()
                               .stream().filter(predicate)
                               .collect(Collectors.toList()))
                 )
map.values().forEach(list -> list.removeIf(predicate.negate()));