Ich versuche, Lambda-Ausdrücke in Java zu verstehen, 8.Der Versuch, in Java Lambda und Strom zu verstehen 8
sagen, dass ich eine Person Klasse, die wie folgt aussieht:
public class Person implements {
String name;
GenderEnum gender;
int age;
List<Person> children;
}
Nun, was ich tun möchte, findet alle Personen, die weiblich sind, die Kinder haben, die jünger als 10 Jahre alt sind.
Pre Java 8 Ich würde es tun, wie folgt:
List<Person> allPersons = somePeople();
List<Person> allFemaleWithChildren = new ArrayList<>();
for(Person p : allPersons) {
for(Person child : p.getChildren()) {
if(child.getAge() < 10 && p.getGender() == GenderEnum.Female) {
allFemaleWithChildren.add(p);
}
}
}
Jetzt allFemaleWithChildren sollte, was ich will. Ich habe versucht, die gleichen mit Hilfe von Streams zu tun Ich glaube, ich brauche eine Art Karte, Filter zu verwenden und
allPersons.stream()
//filter females
.filter(p -> p.getGender == GenderEnum.Female)
//get the children
.map(c -> c.getChildren())
//filter the ones that are less than 10 years
.filter(c -> c.getAge() < 10)
//return a list with the result
.collect(Collectors.toList())
reduzieren Aber dieser Code nicht kompiliert. Was vermisse ich.
Auch ich verstehe nicht, wofür die Reduce-Methode verwendet werden kann.
Der Compiler sagt cannot resolve method getAge()
. Dies liegt daran, c
ist anscheinend eine Sammlung und nicht die Elemente in der Sammlung, die wirklich was ich will.
Was sagt der Compiler? Und was implementiert die Klasse "Person"? –
Das Problem scheint mit der letzten Filtermethode zu sein. 'c.getYear()' weil 'c' eine Sammlung und kein Iterator der Items –
@Duncan ist. Aber es ist meiner Meinung nach nicht relevant. Jeder, der dies klar versteht, sollte meinen Fehler erkennen können, da ich nichts richtig mache. –