Tenho um mapa de mapas - Mapa> - coleção.
Eu preciso para filtrar o mapa e obter o mapa exterior que tem um determinado valor para uma determinada chave do mapa interno.
Eu tentei algumas combinações, mas ele não está funcionando.
Como faço para conseguir isso.
Isto é o que eu tentei
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))));
Basicamente, eu estou esperando o filteredMapForKey ter uma única entrada cujo mapa (o valor da entrada) interior para conter uma chave cujo valor é channelId
Como faço para conseguir isso. O código acima está retornando todo o mapa original com as mesmas chaves, mas vazia mapas internos, exceto para o válido. Para o mapa válido, em vez de devolver o mapa interna completa, é apenas devolver o mapa com a chave e valor de ID do canal correspondente
obrigado
Parece que há duas coisas para corrigir aqui:
A lógica de filtro para filtrar as entradas em vez de filtrá-los.
Para filtrar apenas aquelas entradas exteriores para os quais mapa interiores satisfaz a condição descrita.
Você pode conseguir que, como:
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));
Este filtra todas as entradas de mapa exteriores de tal modo que, o mapa interno para eles tem um valor que é igual (ignoreCase) para o dado channelId
e, em seguida, recolhe estas entradas para um semelhante Map
como a entrada.