Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

...

Det er flere andre metoder som ligner på anyMatch: allMatch (alle element i en stream tilfredsstiller predikatet), noneMatch (ingen matcher), findAny (returnerer et element som tilfredsstiller predikatet), findFirst (returnerer det første elementet som tilfredsstiller predikatet).

 

forEach

forEach tar inn en Consumer-instans og kaller denne instansens ene metode på alle elementene i streamen. La oss legge til et år på alle personenes alder.

 

Code Block
themeEclipse
languagejava
titleTradisjonell måte
for (Person p : persons) {
    p.setAge(p.getAge() + 1);
}

 

 

Code Block
themeEclipse
languagejava
titleMed lambda
persons.stream().forEach(p -> p.setAge(p.getAge() + 1));

 

Vi kan også kombinere funksjoner på streams, for eksempel filter og forEach. La oss si vi vil legge til et år på alderen til alle gutter under 18:

 

Code Block
themeEclipse
languagejava
titleTradisjonell måte
for (Person p : persons) {
    if (p.getAge() < 18 && p.getGender() == 'M')
        p.setAge(p.getAge() + 1);
}

 

 

Code Block
themeEclipse
languagejava
titleMed lambda
persons.stream()
	.filter(p -> p.getAge() < 18 && p.getGender() == 'M')
	.forEach(p -> p.setAge(p.getAge() + 1));

 

Filter

Filter er en svært vanlig operasjon på lister (i likhet med map og reduce som vi nevner senere), som mange programmeringsspråk har støtte for. Filter kalles på en liste, og returnerer en ny liste med kun de elementene som tilfredsstiller et gitt predikat. Den filtrerer med andre ord ut alle element som ikke matcher predikatet. For eksempel: Hvilke personer er over 18 år?

...

Siden filter-funksjonen returnerer en stream, bruker vi collect for å gjøre den til en List.

 

forEach

Map

Map brukes for å danne en ny liste av en annen liste, der en gitt funksjon blir kalt forEach tar inn en Consumer-instans og kaller denne instansens ene metode på alle elementene i streamen. La oss legge til et år på alle personenes alderlista. For eksempel, for å få en liste over alle aldrene til personene, vil vi kalle getAge-funksjonen på alle personene i lista, og legge aldrene i en ny liste.

 

Code Block
themeEclipse
languagejava
titleTradisjonell måte
List<Integer> ages = new ArrayList<Integer>();
for (Person p : persons) {
    pages.setAgeadd(p.getAge() + 1);
}
System.out.println(ages);

 

 

Code Block
themeEclipse
languagejava
titleMed stream og lambda
 System.out.println(persons.stream().forEach(p -> p.setAge(p.getAge() + 1map(Person::getAge).collect(Collectors.toList()));

 

Map tar en instans av typen Function som argument. Du ser kanskje det doble kolonet. Det er en ny operator introdusert i Java 8 som lar en referere til en metode i seg selv, i stedet for returverdien til den metoden. Slik kan vi enkelt gi den metoden vi ønsker som argument. 

Det finnes spesielle map-funksjoner også, som mapToInt og mapToDouble. Disse returnerer henholdsvis IntegerStream og DoubleStream, som har hendige metoder som average(), sum(), min() og max().

Reduce

Reduce brukes for å redusere en liste til et enkelt svar. Reduce tar to og to element i lista og kombinerer disse på en gitt måte. Reduce brukes ofte sammen med map. La oss finne totalalderen i lista vår.Vi kan også kombinere funksjoner på streams, for eksempel filter og forEach. La oss si vi vil legge til et år på alderen til alle gutter under 18:

 

Code Block
themeEclipse
languagejava
titleTradisjonell måte
int totalAge = 0;
for (Person p : persons) {
    totalAge += p.getAge();
}
System.out.println(totalAge);

 

 

Code Block
themeEclipse
languagejava
titleMed stream og lambda
 System.out.println(persons.stream().map(Person::getAge).reduce((e1, e2) -> e1 + e2).get());

 

Grunnen til at vi kaller .get() på slutten er fordi reduce returnerer en objekt av typen Optional. Det er en container-type som kan inneholde et eksisterende objekt, eller null. Dersom det inneholder et faktisk objekt, vil isPresent() returnere true, og get() vil returnere verdien. Reduce kan også ta i bruk det doble kolonet. La oss finne maksimumsalderen:

 

Code Block
themeEclipse
languagejava
titleTradisjonell måte
int maxAge = 0;
for (Person p : persons) {
    if (p.getAge() > maxAge)
        maxAge = p.getAge();
}
System.out.println(maxAge);if (p.getAge() < 18 && p.getGender() == 'M')
        p.setAge(p.getAge() + 1);
}

 

 

Code Block
themeEclipse
languagejava
titleMed stream og lambda
 System.out.println(persons.stream()
	.filter(p -> p.getAge() < 18 && p.getGender() == 'M')
	.forEach(p -> p.setAge(p.getAge() + 1));

 

...

map(Person::getAge).reduce(Math::max).get());