Eu preciso usar lambdas para gerar algumas listas de novos objetos. Estes novos objetos herdam alguns dos traços dos existentes. Uma vez que é difícil descrevê-lo sem entrar em muitos detalhes delicados, vou usar um exemplo de um pai e seus filhos.
Eu quero gerar uma lista de crianças com base em uma lista de pessoas (uma pessoa = um kid). As crianças devem herdar apenas alguns traços de seus pais (neste caso, vamos dizer que é uma cor de pele).
Desde que eu estou um pouco forçado a lambdas de uso (mas também quiser aprender como ele funciona), eu tentei o seguinte solução, mas eu não consigo superar o problema com o mapeamento correto (não vi nada como isso ainda e eu 'estou fazendo um método de tentativa e erro). Provavelmente eu tenho um construtor mal feito também.
public class Kid {
private Colour colour;
private Person person;
public Kid(Person person) {
this.colour = person.getColour();
}
public List<Kid> listOfKids() {
return people.stream()
.map(e -> new Kid(e));
}
}
Depois map
você tem um Stream<Kid>
sim o que você precisa é de um List<Kid>
, assim, você vai precisar para recolher a uma lista via toList()
.
return people.stream()
.map(e -> new Kid(e))
.collect(Collectors.toList());
ou se você precisa de uma lista mutável, em seguida, usar toCollection
:
return people.stream()
.map(e -> new Kid(e))
.collect(Collectors.toCollection(ArrayList::new));
Em outra nota, você precisa repensar o seu design.
- em vez de passar um todo
Person
para oKid
construtor apenas passar umColour
( assumindo que é um enum ) caso contrário, passarString
para representar a cor. - ter um
Person
atributo dentro de umKid
modelo não faz muito sentido para ser honesto, é como dizer "uma criança tem uma pessoa" ... talvez o que você está procurando umKid
para herdar dePerson
indicar que "uma criança é uma pessoa "
etc ...