如何在Java中过滤映射以仅保留特定键

如何在Java中过滤映射以仅保留特定键,java,Java,为此,我一直在使用map.keySet().retainal(),但刚刚遇到了一个场景,该场景无法按预期工作 请参见下面的示例代码。我希望object1map在筛选后返回键(key1和key2),但这会给我空白输出。注意:如果我取消注释将key3添加到object1的行,它工作正常(使用key1和key2返回map)。为什么?如何解决这个问题?有没有其他办法 public class Demo { public static void main(String args[]){

为此,我一直在使用
map.keySet().retainal()
,但刚刚遇到了一个场景,该场景无法按预期工作

请参见下面的示例代码。我希望
object1
map在筛选后返回键(key1和key2),但这会给我空白输出。注意:如果我取消注释将key3添加到
object1
的行,它工作正常(使用key1和key2返回map)。为什么?如何解决这个问题?有没有其他办法

public class Demo {

    public static void main(String args[]){

        Map<String,Object> object1 = new HashMap<>();
        object1.put("key1","One");
        object1.put("key2","Two");
        //object1.put("key3","Three");

        List<Map<String,Object>> objects = new ArrayList<>();
        objects.add(object1);


        Set<String> attributes = new HashSet<>();
           attributes.add("key1");
           attributes.add("key2");

        System.out.println("Objects before filter:"+objects);

        System.out.println("Objects after filter:"+objects.stream().filter(map -> map.keySet().retainAll(attributes)).collect(Collectors.toList()));

    }

}
公共类演示{
公共静态void main(字符串参数[]){
Map object1=新的HashMap();
反对1.付诸表决(“第1项”、“第1项”);
反对1.付诸表决(“第2项”、“第2项”);
//反对1.付诸表决(“第三项”、“第三项”);
列表对象=新的ArrayList();
添加(object1);
Set attributes=newhashset();
属性。添加(“键1”);
属性。添加(“键2”);
System.out.println(“过滤器前的对象:+对象”);
System.out.println(“过滤器后的对象:+Objects.stream().filter(map->map.keySet().retainal(attributes)).collect(Collectors.toList()));
}
}

这是因为过滤器
map.keySet().retainal(属性)
返回
false
,因为设置未更改:

:

@如果此集合因调用而更改,则返回true

你在找什么

如果此集合包含指定集合的所有元素,则返回true


由于您实际上并不关心地图是否保留,请尝试这样称呼它:

System.out.println("Objects after 
filter:"+objects.stream().filter(map -> 
{ 
  map.keySet().retainAll(attributes); // Modify your map
  return !map.keySet().isEmpty(); // Include sets with data
}
).collect(Collectors.toList()));

谢谢你的快速回复。containsAll本身不会帮助解决我的用例,因为我需要在映射中保留存在于其他集合中的键,在所有情况下,例如(set包含可能与map完全匹配的键,可能包含额外的键,可能包含更少的键..等等)。然而,您指出的javadoc帮助我找到了一个解决方案,到目前为止,它似乎适用于所有场景。objects.stream().filter(map->(map.keySet().retainal(attributes)==false?true:true)).collect(collector.toList())@my2cents
map.keySet().retainAll(属性)=false?真的:真的
毫无意义。我想你可能在找
Stream.peek()
@shmosel你为什么这么认为?你认为它什么都不做吗?我正在做这方面的保留,如果出现错误的情况,我将重新绘制完整的地图,而不是什么都不做。查看这个System.out.println(objects.stream().filter(map->true).collect(Collectors.toList())中的区别;System.out.println(objects.stream().filter(map->false).collect(collector.toList());你为什么要全部过滤?是否有要从结果中排除的地图?是的,如果没有一个键匹配,则排除整个地图,如果该地图中的几个键匹配,则仅保留该地图列表中的那些键。我也接受您的答案,因为我是新的,没有任何要点,因此这里似乎没有反映出来