Streams Flashcards

1
Q

Kunnen we een stream pipeline maken zonder intermediate operator?

En kan dit ook zonder terminal operator?

A

Ja

Ja. Maar houd in het achterhoofd dat streams ‘lazy’ zijn en er dus niets mee gebeurt zonder terminal operator.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
2
Q

Wat zijn de zes intermediate operators voor een stream?

A

map(), filter(), distinct(), sorted(), limit(), skip()

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
3
Q

Noem 5 voorbeelden van terminal operators voor streams

A

forEach(), toArray(), reduce(), collect(), min(), max(), count(), anyMatch(), allMatch(), noneMatch(), findFirst(), findAny()

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
4
Q

Wat zijn de verschillen tussen intermediate en terminal operators in streams?

A

Intermediate operators zullen altijd iets returnen, omdat dit meegenomen moet worden naar een volgende operator. Terminal operators returnen niet altijd iets.

We kunnen meerder intermediate operators chainen in een pipeline. Maar er mag slechts 1 terminal operator zijn.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
5
Q

Kunnen we met een stream de bron (bijv. een arraylist) aanpassen?

A

Nee. We kunnen enkel een nieuwe arraylist aanmaken waarin we nieuwe waardes zetten.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
6
Q

Beschouw deze code:
... myVariable = myProducts .stream() .filter(product -> product.price > 3);

Wat is het type van myVariable?

A

Stream of Stream<Integer>.
Omdat het geen terminal operator bevat is dit een Stream.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
7
Q

Kunnen we een stream maken en hier meteen waardes in zetten om over te itereren?
Zo ja, hoe?

A

Jazeker, met Stream.of
bijvoorbeeld:

Stream<String> myStream = Stream.of("Hello", "my", "world");

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
8
Q

Wat is het verschil tussen de map en flatmap operator voor streams?

A

Een map neemt een object als input, doet daar iets mee en returnt iets als output. De output maakt niet uit, maar dient wel overeen te komen met een eventueel toegewezen type.

Een flatMap neemt een object als input en returnt een stream. Dit kan zinvol zijn wanneer je meerdere Lists terug wil brengen tot 1 list.
Meer info

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
9
Q

Wat is het verschil tussen findFirst en findAny?

A

findFirst is in de meeste gevallen zinvol en voldoende. Het vindt het eerste element in de collectie.

In parallel processing kan findAny zinvoller zijn, omdat deze operator geen rekening houdt met volgorde.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
10
Q

Hoe check ik of een stream minstens 1 item bevat met een bepaalde waarde.

A

met anyMatch

deze method vraagt een predicate lambda en returnt dus een boolean als de geformuleerde conditie(s) klopt / kloppen.

anyMatch is een terminal operator en returnt een boolean.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
11
Q

Hoe check ik of alle items in een stream een bepaalde waarde bevatten.

A

met allMatch

deze method vraagt een predicate lambda en returnt dus een boolean als de geformuleerde conditie(s) klopt / kloppen.

allMatch is een terminal operator en returnt een boolean.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
12
Q

Hoe converteer ik een stream naar een List, Map of Set?

A

met de collect method:
.collect(Collectors.toList) als terminal operator te gebruiken. toList kan ook toMap of toSet zijn.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
13
Q

Hoe genereer ik een stream met waarden?

A

met Stream.generate()
we kunnen bijvoorbeeld zeggen:
Stream.generate(UUID::randomUUID);
let er wel op dat deze stream nu infinite is, en dus een limiet nodig heeft.
met .limit(10) als intermediate operator zorgen we ervoor dat er 10 uuids worden gegenereerd.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
14
Q

Stel, ik heb een ArrayList:
List<Integer> myList = Arrays.asList(12, 3, 7, 24, 44, 19);
Wat moet ik doen om deze waarden met een stream bij elkaar op te tellen?

A

Bijvoorbeeld:
int total = myList.stream().reduce((item, subTotal) -> { return item + subTotal; }).get();

dit kan nog afgekort worden tot:
int total = myList.stream().reduce(Integer::sum).get();

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
15
Q

beschrijf .reduce in streams:
- is het een terminal of intermediate operator?
- wat neemt het op en wat geeft het terug?

A

reduce is een terminal operator.

Deze operator is bedoeld om verschillende lists, sets of andere collecties plat te slaan tot 1 waarde (als een string of een int)

het vereist een initiële waarde (vaak 0 of een lege string), en twee parameters. 1 voor het subtotaal en 1 voor hetgeen dat daarbij opgeteld / afgetrokken wordt.

Voorbeeld:

String names = persons.stream()
.map(Person::getName)
.reduce(“”, (acc, name) -> acc + name);

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
16
Q
A
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
17
Q

Wat voor object kunnen we aanmaken om aan te kaarten dat een variabele wel of geen waarde heeft?

A

Een Optional

18
Q

Hoe setten we een optional waarde?

A

Optional.of(variable)

19
Q

Hoe halen we een optional waarde op? En wat doet het wanneer de optional geen waarde bevat.

A

mijnOptionalObject.get().

gooit exception bij optional zonder waarde

20
Q

Wat is de toegevoegde waarde van een Optional?

A

Built in methods die je dingen laat doen wanneer een bepaalde optional wel of geen waarde heeft.

21
Q

Met welke method voer ik een consumer lambda uit wanneer een Optional een waarde bevat.

A

ifPresent(Consumer c) voert een Consumer uit wanneer de optional een waarde bevat. Doet niks bij geen waarde

22
Q

Hoe geef ik een boolean terug die checkt of een Optional object een waarde heeft?

A

isPresent()

23
Q

Welke Optional instance method returnt een de waarde, wanneer deze aanwezig is, en een parameter wanneer deze niet aanwezig is?

A
  • orElse(T other) returnt de parameter bij false
24
Q

Welke Optional instance method returnt een de waarde, wanneer deze aanwezig is, en een Supplier wanneer deze niet aanwezig is?

A

orElseGet(Supplier s) returnt de supplier wanneer de optional geen waarde heeft

25
Q

Welke Optional instance method returnt een de waarde, wanneer deze aanwezig is, en een NoSuchElementException wanneer deze niet aanwezig is?

A

orElseThrow() gooit een NoSuchElementException wanneer er geen waarde is

26
Q

Welke Optional instance method returnt een de waarde, wanneer deze aanwezig is, en een Supplier (die een Exception oplevert) wanneer deze niet aanwezig is?

A

orElseThrow(Supplier s) gooi een exception d.m.v een supplier bij geen waarde

27
Q

Kun je een lambda parameter een parameter geven met dezelfde naam als een andere variabele in die scope? (lees: method)

A

Nee, lambda parameters moeten een unieke naam hebben.

28
Q

Wat voor parameters moeten we in Arrays.binarySearch zetten en hoe returnt het een waarde?

A

binarySearch eist 2 parameters:
1) De array
2) het item waar je naar zoekt

dan returnt het bij een positief resultaat de index van het item (zero based).

wanneer het item niet in de array wordt gevonden geeft het een negatief resultaat.

belangrijk:
het gaat de waardes 1 voor 1 af. In geval van een negatief resultaat (niets gevonden): het item wordt geplaatst tussen de 2 items waar het als eerste tussen past.
voorbeeld 1:
in array [2, 7, 12, 18, 24] zoek ik naar 5
resultaat is -2 (5 is groter dan 2, kleiner dan 7)
voorbeeld 2:
in array [18, 9, 12, 4, 2] zoek ik naar 5
resultaat is -1 (5 is kleiner dan 18)

29
Q

Hoe maak ik een infinite stream?

A

Bijvoorbeeld:
Stream<Double> randoms = Stream.generate(Math::random);
of:
Stream<Integer> oddNumbers = Stream.iterate(1, n -> n + 2);

30
Q

Wat is het verschil tussen .reduce en .collect in een stream?

A

.reduce is bedoeld voor immutable objects (Strings bijvoorbeeld)
.collect is geschikt voor immutable objects zoals een StringBuilder en ArrayList

31
Q

Met welke stream operator haal ik duplicates weg uit een ArrayList?

A

.distinct.

voorbeeld:
Stream<String> s = Stream.of("duck", "duck", "duck", "goose"); s.distinct() .forEach(System.out::print); // duckgoose

32
Q

Met welke itermediate operator slaan we een x aantal items over in een stream

A

.skip(int aantalItems).

.skip(5) slaat 5 items over.
skip zonder aantal items is niet toegestaan

33
Q

Hoe maken we een list met een stream de omgekeerde volgorde?

A

met .sorted(Comparator.reverseOrder())

34
Q

Wat is .boxed in een stream en wanneer gebruiken we het?

A

.boxed gebruiken we om een stream van primitives (IntStream, DoubleStream, en LongStream) om te zetten naar het juiste type. Het kan dus ook alleen op deze types gebruikt worden!

35
Q

is .peek in een stream een terminal operation?
en wat doet het?

A

Nee! Hoewel dit effectief hetzelfde doet als een foreach is dit de intermediate equivalent ervan.

verwar dit ook niet met de peek van een Deque. Dat geeft 1 item terug, maar .peek in een stream geeft alle items terug.

36
Q

wat doet .concat in een stream

A

Voegt twee streams samen tot 1. Vraagt 2 parameters, beide een stream. En levert een nieuwe stream op.

37
Q

wat doet .teeing in een stream

A

Teeing neemt twee collectors. Dit kunnen bijvoorbeeld verzamelingen of waardes van gefilterde data zijn. Teeing returnt vervolgens 1 nieuw object.

Voorbeelden:
https://howtodoinjava.com/java12/collectors-teeing-example/

38
Q

Compileert deze code? Waarom wel / niet?

`
Predicate<String> predicate = s -> s.length()> 3;
var stream = Stream.iterate("-",
s -> ! s.isEmpty(), (s) -> s + s);
var b1 = stream.noneMatch(predicate);
var b2 = stream.anyMatch(predicate);
`</String>

A

Compileert niet. Een stream kan slechts 1 terminal operation hebben. Dit betekent in dit geval dus ook dat er geen nieuwe terminal operation aan een nieuwe variable toegewezen kan worden, wanneer we dezelfde stream gebruiken.

39
Q

compileert dit?
double result = LongStream.of(6L, 8L, 10L) .mapToInt(x -> x)

A

Nee. Je zal met mapToInt(x -> (int) x) naar een int moeten casten.

40
Q

Stel, we hebben een IntStream. en hier willen we gemiddeldes etc. van berekenen.
Wat voor types returnen:
.average()
.findAny()
.sum()

in een stream?

A

average returnt een OptionalDouble.
findAny returnt een OptionalInt
sum returnt een int. (bij geen waardes returnt sum simpelweg 0 dus er is geen sprake van Optional)