Eu quero saber como extrair um List<D>
de um HashMap<E,R>
considerando essas restrições:
E
é uma classe personalizada;R
é uma classe personalizada que contém umaSet<D>
de objetos personalizados;
O que eu tentei: Eu tentei abordar a questão em esta questão .
Nesse caso anterior, I simples Map<E,List<R>>
, mas neste caso eu tenho para acessar a R
classe que tem o alvo Set<D>
.
O que eu quero fazer na seguinte parte do código é fazer com que os elementos dos Set<D>
cujos nomes país são iguais ao parâmetro dado.
Eu tentei usar a mesma solução:
Map<E,R> map = new HashMap<E,R>();
public List<D> method(String countryname) {
return map.values().stream().filter((x)->{
return x.getSet().stream().anyMatch((t) -> {
return t.getCountry().equals(countryname);
});
})
.map(R::getSet)
.flatMap(List::stream)
.collect(Collectors.toList()); //does not compile
}
// the R class
class R {
private Set<D> set = new TreeSet<D>();
//getters & setters & other attributes
}
Eu acredito que o flatMap
passo está errado, já que seu map
passo transforma o seu Stream<R>
a um Stream<Set<D>>
, então flatMap(List::stream)
deve ser flatMap(Set::stream)
:
return map.values()
.stream()
.filter(x -> x.getSet().stream().anyMatch(t -> t.getCountry().equals(countryname)))
.map(R::getSet)
.flatMap(Set::stream)
.collect(Collectors.toList());
Além disso, como você pode notar acima, o código pode ser muito mais legível se você evitar o uso de chaves quando você não tem que.