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

Filter on a value of inner Map using Java 8 streams

我有地图的地图-地图>-collection.

我需要过滤地图并获取外部地图,该外部地图对内部地图的给定键具有给定值。

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

我该如何实现。

这是我试过的

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 的键

我该如何实现。上面的代码是 return 使用相同的键对整个原始地图进行处理,但内部地图除了有效地图外都是空的。对于有效地图,而不是 return 完整的内部地图,它只是 return 具有匹配通道 id

的键和值的地图

谢谢

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

  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作为输入。