In Kotlin, Flow represents a cold stream concept. Similar to Stream in Java or Sequence in Kotlin, we can
manipulate the data inside the flow (filter, transform, collect, etc). The Flow API, just like Stream and
Sequence, offers two types of operations: intermediate and terminal. Intermediate operations again return a Flow instance,
all other operations are considered terminal. As flows are naturally lazy, no operations will actually be started until a terminal operation is
called.
This rule reports an issue when the result of an intermediate operation on Flow is left unused.
Noncompliant code example
suspend fun main() {
val flow = flow {
emit(1)
emit(2)
emit(3)
}
flow.take(2) // Noncompliant, the result of this operation is never used
}
Compliant solution
suspend fun main() {
val flow = flow {
emit(1)
emit(2)
emit(3)
}
flow.take(2).collect { println(it) } // Compliant, collect is a terminal operation
}