Usando Streams filtro de mapa com base em uma lista de chaves

Richard C:

Eu tenho um problema particular e queria saber se o Java 8 Streams API poderia resolvê-lo. Eu sei que isso pode ser feito fora de usar Streams API, mas eu não quero adicionar todo o código clichê associado com a tentativa de conseguir que, se isso pode ser feito usando Streams. Eu tenho um mapa

Map<String, String> greetings = new HashMap<>();
greetings.put("abc", "Hello");
greetings.put("def", "Goodbye");
greetings.put("ghi", "Ciao");
greetings.put("xyz", "Bonsoir");

e uma lista de chaves:

List<String> keys = Arrays.asList("def", "zxy");

e usando a acima com Streams API, é possível filtrar esse baixo para:

Map<String, String> filteredGreetings = new HashMap<>();
filteredGreetings.put("def", "Goodbye");
filteredGreetings.put("xyz", "Bonsoir");

Esperemos que isso faz sentido que eu estou tentando alcançar.

Até agora eu tenho isso funcione somente quando especificando a chave exata que para filtrar keySet do mapa, mas isso só iria retornar um único conjunto de entrada. Estou interessado em um mapa completamente filtrada para baixo e eu estou lutando para conseguir isso.

Samuel Philipp:

Tente isto:

Map<String, String> result = keys.stream()
        .filter(greetings::containsKey)
        .collect(Collectors.toMap(Function.identity(), greetings::get));

Ou do outro modo:

Map<String, String> result = greetings.entrySet().stream()
        .filter(e -> keys.contains(e.getKey()))
        .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));

Para a segunda abordagem que eu recomendo usar um Set<String>para uma lista maior de keysporque tem um O (1) tempo de complexidade para .contains()porque ele não contém quaisquer duplicatas:

Set<String> keys = new HashSet<>(Arrays.asList("def", "zxy"));

Acho que você gosta

Origin http://43.154.161.224:23101/article/api/json?id=226837&siteId=1
Recomendado
Clasificación