Direct naar de hoofdinhoud
Module 7 · Les 2 van 214/14 in de cursus~15 min
Modulelessen (2/2)

Stream-API

Met de Stream API in Java kunt u verzamelingen objecten op een declaratieve manier verwerken, waarbij gebruik wordt gemaakt van functionele programmering. Een stroom slaat geen gegevens op, maar transporteert in plaats daarvan elementen uit een bron (zoals een lijst of een array) door een pijplijn van bewerkingen.

Een Stream-pijplijn bestaat uit drie delen:

  1. Een bron (bijvoorbeeld list.stream())
  2. Geen of meer tussenbewerkingen (die een nieuwe stream retourneren, bijvoorbeeld filter, map)
  3. Een terminalbewerking (die een eindresultaat of neveneffect oplevert en de stream sluit, bijvoorbeeld collect, forEach, reduce)

Gemeenschappelijke tussenliggende bewerkingen

Tussenliggende bewerkingen zijn lui: ze worden pas uitgevoerd als een terminalbewerking wordt aangeroepen.

  • filter(Predicate): filtert elementen op basis van een Booleaanse voorwaarde.
  • map(Function): transformeert elk element in een ander object door een functie toe te passen.
  • sorted(): sorteert de elementen van de stream.
Java
List<String> names = Arrays.asList("Marco", "Anna", "Giovanni");
List<String> filtered = names.stream()
                             .filter(name -> name.startsWith("M"))
                             .map(name -> name.toUpperCase())
                             .collect(Collectors.toList()); // "MARCO"

Gemeenschappelijke terminalbewerkingen

  • forEach(Consumer): voert een actie uit voor elk element van de stream.
  • collect(Collector): verzamelt de Stream-resultaten in een container (bijvoorbeeld een lijst met Collectors.toList()).
  • reduce(identity, BinaryOperator): combineert de Stream-elementen tot één cumulatieve waarde.
Java
List<Integer> numbers = Arrays.asList(1, 2, 3, 4);
int sum = numbers.stream()
                 .reduce(0, (a, b) -> a + b); // Sums all numbers: 10

Probeer het zelf

Oefening#java.m7.l2.e1
Pogingen: 0Laden…

Voltooi de code met behulp van de stroom getallen om alleen even getallen te filteren, verzamel ze in een nieuwe lijst met de naam evens en druk deze af met System.out.println.

Editor laden…
Toon hint

Begin met het aanroepen van `numbers.stream()`, voeg `.filter(n -> n % 2 == 0)` toe en verzamel tenslotte met `.collect(Collectors.toList())`.

Oplossing beschikbaar na 3 pogingen

Oefening#java.m7.l2.e2
Pogingen: 0Laden…

Gebruik streams om alle namen in de namenlijst om te zetten in hoofdletters met behulp van kaart, en druk ze één voor één af met behulp van forEach met een methodereferentie.

Editor laden…
Toon hint

Gebruik `.map(s -> s.toUpperCase())` gevolgd door de terminalbewerking `.forEach(System.out::println)`.

Oplossing beschikbaar na 3 pogingen

Oefening#java.m7.l2.e3
Pogingen: 0Laden…

Voltooi de code door de som van alle getallen in de getallenlijst te berekenen met behulp van een Stream en de terminalbewerking te verkleinen met een beginwaarde van 0. Druk de som af.

Editor laden…
Toon hint

Gebruik `numbers.stream().reduce(0, (a, b) -> a + b)` en druk de resulterende variabele af.

Oplossing beschikbaar na 3 pogingen