Filter a list to items that are both positive and even.
← Streams and Pipelines · Ref: Q1144
Chain multiple filter stages with the pipe operator:
cat items | filter by isPositive | filter by isEven | collect as List of Integer
Each filter uses a separate pure predicate function. The pipe operator chains stages naturally, like Unix pipes. See Q235 for stream operations. See Q237 for streams vs loops.
Example
#!ek9 defines module qa.streams.chainfilters defines function isPositive() as pure -> num as Integer <- rtn as Boolean: num > 0 isEven() as pure -> num as Integer <- rtn as Boolean: num mod 2 == 0 intToString() as pure -> num as Integer <- rtn as String: $num defines program ChainFiltersDemo() stdout <- Stdout() items <- [-5, 2, -3, 8, 7, -4, 6, 1, 10, -2, 0] // Chain two filters: positive AND even positiveEvens <- cat items | filter by isPositive | filter by isEven | collect as List of Integer stdout.println(`Positive and even: ${positiveEvens}`) // Stream directly to stdout stdout.println("Streamed:") cat items | filter by isPositive | filter by isEven | map with intToString > stdout
Common mistakes
E50030 — Stream filter predicates must return Boolean. A function used with 'filter by' must return Boolean, not Integer. See ek9 -h E50030 for details.
Incorrect:
<- rtn as Integer: num > 0
Correct:
<- rtn as Boolean: num > 0
Other ways to ask this
- Write code to chain two filter stages in a stream pipeline
- I have a list of integers and need only those that are positive AND even
- Given a mixed integer list, select values that pass two predicate tests
- In Java I'd use stream().filter(n -> n > 0).filter(n -> n % 2 == 0). Write the EK9 equivalent
Coming from another language?
Java: stream().filter(pred1).filter(pred2). Python: filter(pred2, filter(pred1, iterable)). Rust: iter().filter().filter(). EK9: cat | filter by pred1 | filter by pred2.
Keywords: chain, even, filter, multiple, pipe, pipeline, positive, predicate, stream