Flow Terminal Operators

Flow Terminal Operators

In this series of articles , we are discussing about Kotlin flows and in this article we will discuss about Flows Terminal operators

Code gist can be found in https://gist.github.com/vprabhu/20bf26e73451ae9ea0876e3780537d4a

Whats is Terminal Operators?

  • Its a suspend function

  • Starts the flow's collection


Terminal Operators List

There are some terminal operators which we can used to start the collection of the flow

Collect()

  • collects the given flow

  • commonly used with onEach() , onCompletion() and catch to collect all emitted values

      val flow = flow {
          delay(200)
          emit(1)
    
          delay(200)
          emit(2)
    
          delay(200)
          emit(2)
      }
    
        flow.collect { receivedValue ->
                  println("Collect Received value 1: $receivedValue")
                  /** Output :
                   * Collect Received value 1: 1
                   * Collect Received value 1: 2
                   * Collect Received value 1: 2
                   */
        }
    

first() and last()

  • first() returns the first element emitted by flow and cancels the flow's cancellation.

  • last() returns the last element emitted by the flow.

val itemFirst = flow.first()
println("first() flow : $itemFirst")
/** Output :
 * first() flow : 1
 */

val itemLast = flow.last()
println("last() flow : $itemLast")
/**
 * last() flow : 2
 */

single()

  • Collects the only and one value from flow

  • If flow emits multiple values , it throws the following error

Exception in thread "main" java.lang.IllegalArgumentException: Flow has more than one element
val singleFlow = flow {
        emit("Single Emitted value")
    }

val itemSingle = singleFlow.single()
println("single() flow : $itemSingle") 
/**
*  output : single() flow : Single Emitted value
*/

toSet()

  • converts the flow output to set
val setFLow = flow.toSet()
println("toSet() flow : $setFLow")
/**
 * Output :  toSet() flow : [1, 2]
 */

toList()

  • converts the flow to list
val listFLow = flow.toList()
println("toList() flow : $listFLow")
/**
 * toList() flow : [1, 2, 2]
 */

In the next article , we will discuss about Exception Handling in Flow.

Please leave your comments to improve.

Happy and Enjoy coding