地图过滤器列表导致额外的空项目

Aja*_*mar 3 java dictionary java-stream

我有一个简单的类,如下所示:

public class ListOfMapsExample {
    public static void main(String[] args) {
        Map<String, String> map1 = Map.of("aa1k", "aa1v", "aa2k", "aa2v", "aa3k", "aa3v");
        Map<String, String> map2 = Map.of("bb1k", "bb1v", "bb2k", "bb2v", "bb3k", "bb3v");
        Map<String, String> map3 = Map.of("cc1k", "cc1v", "cc2k", "cc2v", "cc3k", "cc3v");

        List<Map<String, String>> maps = Arrays.asList(map1, map2, map3);

        List<Map<String, String>> listOfMaps1 = maps.stream()
                .map(m -> m.entrySet().stream()
                        .filter(map -> map.getKey().equals("aa1k") || map.getKey().equals("bb2k"))
                        .collect(Collectors.toMap(p -> p.getKey(), p -> p.getValue())))
                .collect(Collectors.toList());

        System.out.println("listOfMaps1 :: " + listOfMaps1);
    }
}
Run Code Online (Sandbox Code Playgroud)

预期输出: listOfMaps1 :: [{aa1k=aa1v}, {bb2k=bb2v}]

实际输出: listOfMaps1 :: [{aa1k=aa1v}, {bb2k=bb2v}, {}]

问题: 即使第三张地图没有通过过滤条件,为什么它在结果中显示为空?我怎么能省略它?

WJS*_*WJS 6

您正在通过过滤每个内容来构建地图。其中之一将是空的,因为没有传递任何值(但您仍然创建了它)。因此,您需要先过滤空地图,然后再将其添加到列表中。

List<Map<String, String>> listOfMaps1 = maps.stream()
        .map(m -> m.entrySet().stream()
                .filter(map -> map.getKey().equals("aa1k")
                        || map.getKey().equals("bb2k"))
                .collect(Collectors.toMap(p -> p.getKey(),
                        p -> p.getValue()))).filter(map->!map.isEmpty())
        .collect(Collectors.toList());

System.out.println("listOfMaps1 :: " + listOfMaps1);
Run Code Online (Sandbox Code Playgroud)