Apply two transformations in sequence: double a number then add ten.

← Functions and Methods · Ref: Q1169

Chain map stages with separate pure functions:

  cat items | map with doubleIt | map with addTen | collect as List of Integer

Each map stage applies a pure function that transforms one value to another. Chaining multiple map stages composes transformations naturally through the pipeline. See Q235 for stream operations. See Q596 for function basics.

Example

defines module qa.functionsandmethods.composefunctions

  defines function

    doubleIt() as pure
      -> num as Integer
      <- rtn as Integer: num * 2

    addTen() as pure
      -> num as Integer
      <- rtn as Integer: num + 10

    intToString() as pure
      -> num as Integer
      <- rtn as String: $num

  defines program

    ComposeFunctionsDemo()
      stdout <- Stdout()

      items <- [1, 2, 3, 4, 5]

      // Chain two transformations: double then add ten
      transformed <- cat items | map with doubleIt | map with addTen | collect as List of Integer
      stdout.println(`Doubled then plus ten: ${transformed}`)

      // Stream to stdout
      stdout.println("Streamed:")
      cat items | map with doubleIt | map with addTen | map with intToString > stdout

Common mistakes

E50060 — EK9 streams use 'cat ... | map with fn | collect as ...' pipe syntax, not Java-style '.stream().map().collect()' method chains. See ek9 -h E50060 for details.

Incorrect:

      transformed <- items.stream().map(doubleIt).map(addTen).collect()

Correct:

      transformed <- cat items | map with doubleIt | map with addTen | collect as List of Integer
Other ways to ask this
  • Write code to chain two map stages in a stream pipeline
  • I have a list of integers and need to apply two sequential transformations
  • Given [1, 2, 3], double each value then add ten to each result
  • In Java I'd use stream().map(x -> x * 2).map(x -> x + 10). Write the EK9 equivalent

Coming from another language?

Java: stream().map(x -> x * 2).map(x -> x + 10). Python: map(lambda x: x + 10, map(lambda x: x * 2, items)). Rust: iter().map(|x| x * 2).map(|x| x + 10). EK9: cat | map with fn1 | map with fn2.

Keywords: compose, chain, pipeline, sequence, stream, map, transform, function