How do filter and sort work together in EK9 streams?

← Streams and Pipelines · Ref: Q929

Chain filter and sort with the pipe operator. Filter first to reduce the dataset, then sort the remaining elements.

PATTERN

  cat items | filter by predicate | sort | collect as List of T
  cat items | filter by predicate | sort > stdout

FILTER narrows the stream to elements matching the predicate (a function returning Boolean). SORT orders the remaining elements using their natural ordering (the <=> operator).

WITH STRINGS

  cat names | filter by startsWithA | sort > stdout

Filters to names starting with 'A', then alphabetically sorts them.

WITH FLOATS

  cat temperatures | filter by aboveFreezing | sort | collect as List of Float

Keeps temperatures above zero, sorts ascending.

Filtering before sorting is more efficient: sort operates on fewer elements.

See Q235 for all stream operations. See Q970 for output redirection. See Q237 for streams vs loops.

Example

#!ek9
defines module qa.streams.filter.sort.example

  defines function

    aboveFreezing() as pure
      -> temperature as Float
      <- rtn as Boolean: temperature > 0.0

    isLongName() as pure
      -> nameToCheck as String
      <- rtn as Boolean?
      minLength <- 4
      rtn: length nameToCheck > minLength

  defines program

    FilterSortDemo()
      stdout <- Stdout()

      //Demonstrate filter predicates that streams would use
      stdout.println(`15.5 above freezing: ${aboveFreezing(15.5)}`)
      stdout.println(`-3.2 above freezing: ${aboveFreezing(-3.2)}`)

      //Demonstrate string predicate for stream filter
      stdout.println(`James is long: ${isLongName("James")}`)
      stdout.println(`Bob is long: ${isLongName("Bob")}`)
Other ways to ask this
  • Can I chain filter and sort in an EK9 stream?
  • How do I filter then sort a list in EK9?
  • What is the correct order for filter and sort in EK9 pipelines?

Coming from another language?

Java: stream().filter(pred).sorted().collect(). Python: sorted(filter(pred, items)). Rust: iter().filter(pred).sorted(). EK9: cat items | filter by pred | sort | collect.

Keywords: chain, filter, order, pipeline, predicate, sort, stream