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

时间:2019-07-15 15:05:34

标签: java filter java-8 java-stream nested-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

我该如何实现。上面的代码使用相同的键返回整个原始地图,但内部的地图却是空的(有效的除外)。对于有效的地图,仅返回具有匹配通道ID的键和值的地图,而不是返回完整的内部地图

谢谢

1 个答案:

答案 0 :(得分:1)

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

  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));

这将过滤所有外部映射条目,以便它们的内部映射具有等于给定channelId的值(ignoreCase),然后将这些条目收集到与外部Map类似的{{1}}中输入。