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.
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 keys
porque 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"));