VelNaga:
Eu estou usando Java8 para alcançar o abaixo coisas,
Map<String, String> m0 = new HashMap<>();
m0.put("x", "123");
m0.put("y", "456");
m0.put("z", "789");
Map<String, String> m1 = new HashMap<>();
m1.put("x", "000");
m1.put("y", "111");
m1.put("z", "222");
List<Map<String, String>> l = new ArrayList<>(Arrays.asList(m0, m1));
List<String> desiredKeys = Lists.newArrayList("x");
List<Map<String, String>> transformed = l.stream().map(map -> map.entrySet().stream()
.filter(e -> desiredKeys.stream().anyMatch(k -> k.equals(e.getKey())))
.collect(Collectors.toMap(e -> e.getKey(), p -> p.getValue())))
.filter(m -> !m.isEmpty())
.collect(Collectors.toList());
System.err.println(l);
System.err.println(transformed);
List<String> values = new ArrayList<>();
for (Map<String,String> map : transformed) {
values.add(map.values().toString());
System.out.println("Values inside map::"+map.values());
}
System.out.println("values::"+values); //values::[[123], [000]]
Aqui, eu gostaria de buscar apenas os valores-x da lista. Tenho conseguido isso, mas não é em um formato adequado.
resultado esperado: os valores :: [123, 000]
Saída real: valores :: [[123], [000]]
Eu sei como corrigir a saída real. Mas há alguma maneira fácil de conseguir esta questão? Qualquer ajuda seria apreciável.
Misha:
Você não precisa iterar sobre todo o mapa para encontrar uma entrada por sua chave. Isso é o que Map.get
é para. Para nivelar a lista de lista de valores, use flatMap
:
import static java.util.stream.Collectors.toList;
.....
List<String> values = l.stream()
.flatMap(x -> desiredKeys.stream()
.filter(x::containsKey)
.map(x::get)
).collect(toList());
Em uma nota lado, evite o uso l
(caso inferior L) como um nome da variável. Ele parece muito com o número 1
.