java - 使用 Java 8 流过滤内部 Map 的值

标签 java filter java-8 java-stream nested-map

我有 map 的 map - map >- Collection 。

我需要过滤 map 并获取具有内部 map 给定键的给定值的外部 map 。

我尝试了一些组合,但没有用。

我如何实现这一目标。

这是我试过的

Map<String, Map<String, String>> originalMap = getOriginalMap();

String channelId = "channelIdVal";

Map<String, Map<String, String>> filteredMapForKey = originalMap.entrySet().stream()
    .collect(Collectors.toMap(Map.Entry::getKey,
        e -> e.getValue().entrySet().stream().filter(innerMap -> innerMap.getValue().equalsIgnoreCase(channelId)).collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue))));

基本上,我希望 filteredMapForKey 有一个条目,其内部映射(条目的值)包含一个值为 channelId

我该如何实现。上面的代码返回具有相同键但内部映射为空的整个原始映射,有效映射除外。对于有效的 map ,不返回完整的内部 map ,只返回匹配 channel id的键和值的 map

谢谢

最佳答案

这里似乎有两点需要更正:

  1. 用于过滤条目而不是过滤条目的过滤逻辑。

  2. 仅过滤那些内部映​​射满足规定条件的外部条目。

您可以通过以下方式实现:

Map<String, Map<String, String>> filteredMapForKey = originalMap.entrySet()
        .stream()
        .filter(e -> e.getValue()
                .values()
                .stream()
                .anyMatch(innerMapVal -> innerMapVal.equalsIgnoreCase(channelId)))
        .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));

这会过滤所有外部映射条目,使得它们的内部映射具有等于(ignoreCase)给定 channelId 的值,然后将这些条目收集到类似的 Map 作为输入。

关于java - 使用 Java 8 流过滤内部 Map 的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57042517/

相关文章:

java - 当我运行一个单线程 Java 程序时,为什么在操作系统级别有多个线程?

JQuery - 根据文本框输入过滤嵌套列表

CSS hue-从红色旋转到特定颜色

string - java 8 String.chars() 是否可以正确处理 8 字节字符?

Java 如何在结果集中检索超过 100 万行

java - 如何以线程安全的方式在 DAO 中缓存信息

java - 是否有像 Optional 这样的类但对于非可选类?

java - Avatar.js 和项目头像

java - log4j INFO 级别不记录信息

ruby-on-rails - Rails Elasticsearch-多个过滤条件