使用 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
的键和值的地图
谢谢
这里似乎有两点需要更正:
用于过滤条目而不是过滤条目的过滤逻辑。
仅过滤那些内部映射满足规定条件的外部条目。
您可以通过以下方式实现:
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
作为输入。
我有地图的地图-地图>-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
的键和值的地图谢谢
这里似乎有两点需要更正:
用于过滤条目而不是过滤条目的过滤逻辑。
仅过滤那些内部映射满足规定条件的外部条目。
您可以通过以下方式实现:
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
作为输入。