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