Bird
Raised Fist0
Kotlinprogramming~10 mins

Combining flows (zip, combine) in Kotlin - Step-by-Step Execution

Choose your learning style10 modes available
Concept Flow - Combining flows (zip, combine)
Start Flow A
↓
Emit value A1
↓
zip/combine
↓
Emit combined value
↓
Wait for next emissions
↓
Emit value A2
↓
zip/combine
↓
Emit combined value
↓
End
Two flows emit values independently. zip waits for both to emit once, then combines pairs. combine emits on any new value, combining latest from both.
Execution Sample
Kotlin
val flowA = flowOf(1, 2)
val flowB = flowOf("A", "B")

flowA.zip(flowB) { a, b -> "$a$b" }
    .collect { println(it) }
This code zips two flows, pairing each number with a letter, then prints combined strings.
Execution Table
StepFlowA EmissionFlowB Emissionzip/combine ActionOutput
11Azip pairs 1 and A"1A"
22Bzip pairs 2 and B"2B"
3--No more emissions, flow ends-
💡 Both flows completed, no more pairs to zip
Variable Tracker
VariableStartAfter 1After 2Final
flowA value-12-
flowB value-AB-
combined output-"1A""2B"-
Key Moments - 3 Insights
Why does zip wait for both flows to emit before producing output?
zip pairs values one-to-one, so it waits for a new value from each flow before combining, as shown in execution_table rows 1 and 2.
What happens if one flow emits more values than the other?
zip stops when the shorter flow ends, so extra values from the longer flow are ignored, as seen in exit_note.
How is combine different from zip in combining flows?
combine emits whenever any flow emits, using the latest values from both, unlike zip which waits for pairs, explained in concept_flow.
Visual Quiz - 3 Questions
Test your understanding
Look at the execution_table, what is the output at Step 2?
A"2B"
B"1B"
C"2A"
D"1A"
💡 Hint
Check the Output column at Step 2 in execution_table
At which step does zip stop emitting values?
AStep 2
BStep 3
CStep 1
DNever stops
💡 Hint
Look at exit_note and Step 3 in execution_table
If flowB emitted an extra value "C", how would zip behave?
AEmit a third combined value with flowA's last value
BCrash with error
CIgnore the extra value and stop after pairs are done
DRepeat the last combined value
💡 Hint
Refer to key_moments about zip stopping when shorter flow ends
Concept Snapshot
zip pairs values from two flows one-to-one, emitting combined pairs.
combine emits on any new value, combining latest from both flows.
zip stops when one flow ends; combine continues with latest values.
Use zip for strict pairing, combine for latest-value updates.
Syntax: flowA.zip(flowB) { a,b -> ... } or flowA.combine(flowB) { a,b -> ... }
Full Transcript
This visual trace shows how Kotlin flows can be combined using zip and combine. Two flows emit values independently. zip waits for both flows to emit a value, then pairs them one-to-one, emitting combined results. The execution table shows step-by-step emissions from flowA and flowB, the zip action pairing values, and the output produced. zip stops when the shorter flow ends, ignoring extra values from the longer flow. combine differs by emitting whenever any flow emits, using the latest values from both. The variable tracker shows how values change after each emission. Key moments clarify why zip waits for both flows and what happens if flows have different lengths. The quiz tests understanding of output at steps, when zip stops, and behavior with extra values. The snapshot summarizes syntax and behavior for quick reference.

Practice

(1/5)
1. What does the zip function do when combining two Kotlin flows?
easy
A. Pairs values one by one from both flows, emitting pairs only when both have emitted.
B. Merges the latest values from both flows whenever either emits.
C. Combines flows by concatenating their emitted values into a single list.
D. Filters values from the first flow based on the second flow's emissions.

Solution

  1. Step 1: Understand zip behavior

    The zip function pairs values from two flows one by one, waiting for both to emit before producing a pair.
  2. Step 2: Compare with other options

    combine merges latest values on any emission, not zip. Other options describe different behaviors.
  3. Final Answer:

    Pairs values one by one from both flows, emitting pairs only when both have emitted. -> Option A
  4. Quick Check:

    zip pairs values one by one = A [OK]
Hint: Remember: zip waits for both flows to emit one value each [OK]
Common Mistakes:
  • Confusing zip with combine behavior
  • Thinking zip merges latest values on any emission
  • Assuming zip concatenates values into a list
2. Which of the following is the correct syntax to combine two flows flowA and flowB using combine in Kotlin?
easy
A. flowA.combine(flowB) { a, b -> a + b }
B. flowA.zip(flowB) { a, b -> a + b }
C. combine(flowA flowB) { a, b -> a + b }
D. flowA.merge(flowB) { a, b -> a + b }

Solution

  1. Step 1: Recall combine extension syntax

    combine is called as an extension on one flow with another flow as argument and a lambda combining values.
  2. Step 2: Check options

    flowA.combine(flowB) { a, b -> a + b } matches the correct syntax. flowA.zip(flowB) { a, b -> a + b } uses zip, C uses top-level combine which is invalid, D uses non-existent merge with lambda.
  3. Final Answer:

    flowA.combine(flowB) { a, b -> a + b } -> Option A
  4. Quick Check:

    combine is an extension function = B [OK]
Hint: combine is called as flowA.combine(flowB) with lambda [OK]
Common Mistakes:
  • Using zip instead of combine
  • Trying to call combine as a top-level function
  • Using merge with a lambda (not valid)
3. What will be the output of the following Kotlin code?
val flow1 = flowOf(1, 2, 3)
val flow2 = flowOf("A", "B", "C", "D")

runBlocking {
  flow1.zip(flow2) { a, b -> "$a$b" }
    .collect { println(it) }
}
medium
A. 1A 2B 3C 4D
B. 1A 2B 3C
C. 1A 2B 3C D
D. A1 B2 C3 D4

Solution

  1. Step 1: Understand zip behavior with unequal flow lengths

    zip pairs elements one by one until the shortest flow ends. Here, flow1 has 3 elements, flow2 has 4.
  2. Step 2: Determine output pairs

    Pairs: (1, "A"), (2, "B"), (3, "C"). The extra "D" in flow2 is ignored.
  3. Final Answer:

    1A 2B 3C -> Option B
  4. Quick Check:

    zip stops at shortest flow length = C [OK]
Hint: zip stops when shortest flow ends, extra values ignored [OK]
Common Mistakes:
  • Expecting zip to emit all values from longer flow
  • Confusing zip with combine behavior
  • Mixing order of concatenation in output
4. Identify the error in this Kotlin code using combine and fix it:
val flow1 = flowOf(1, 2)
val flow2 = flowOf("X", "Y")

runBlocking {
  flow1.combine(flow2) { a, b -> "$a$b" }
    .collect { println(it) }
}
medium
A. No error; code runs and prints combined values.
B. Lambda parameters should be reversed: { b, a -> ... }.
C. Cannot call combine on flowOf; use zip instead.
D. Missing import for combine; add import kotlinx.coroutines.flow.combine.

Solution

  1. Step 1: Check for common mistakes with combine

    combine is an extension function requiring import from kotlinx.coroutines.flow.
  2. Step 2: Identify missing import

    Without import kotlinx.coroutines.flow.combine, code won't compile. Other options are incorrect because combine works on flowOf and lambda parameter order is correct.
  3. Final Answer:

    Missing import for combine; add import kotlinx.coroutines.flow.combine -> Option D
  4. Quick Check:

    Missing import causes compile error = D [OK]
Hint: Always import combine from kotlinx.coroutines.flow [OK]
Common Mistakes:
  • Forgetting to import combine function
  • Thinking combine is not available on flowOf
  • Swapping lambda parameters incorrectly
5. You want to combine two flows flowA and flowB so that every time either emits, you get the latest values from both. Which function should you use and why?
hard
A. Use merge because it merges emissions into a single flow without pairing.
B. Use zip because it pairs values one by one, ensuring synchronized pairs.
C. Use combine because it emits on any flow emission with latest values from both.
D. Use flatMapConcat to flatten emissions from both flows sequentially.

Solution

  1. Step 1: Understand the requirement

    You want to emit combined latest values whenever either flow emits, not just pair one by one.
  2. Step 2: Match function behavior

    combine merges latest values from both flows on any emission. zip waits for pairs, merge just merges emissions without combining, and flatMapConcat flattens sequences.
  3. Final Answer:

    Use combine because it emits on any flow emission with latest values from both. -> Option C
  4. Quick Check:

    combine merges latest values on any emission = A [OK]
Hint: combine emits latest from both on any emission, zip waits for pairs [OK]
Common Mistakes:
  • Choosing zip instead of combine for latest values
  • Confusing merge with combine
  • Using flatMapConcat which flattens sequences, not combines
Recommended

Ready to prove it?

Pass the test and this pattern moves unknown strong while earning +1 Grip toward your certificate.

10 questions~5 mineasy hard