What does the zip operator do when combining two Kotlin flows?
The zip operator pairs elements from two flows one by one, emitting a combined value only when both flows have emitted an element. It stops when the shortest flow ends.
Click to reveal answer
beginner
How does the combine operator differ from zip in Kotlin flows?
combine emits a new value every time any of the flows emits, using the latest values from both flows. It does not wait for both to emit simultaneously like zip.
Click to reveal answer
beginner
Show a simple Kotlin code snippet using zip to combine two flows of numbers.
val flow1 = flowOf(1, 2, 3)
val flow2 = flowOf(10, 20, 30)
flow1.zip(flow2) { a, b -> a + b }
.collect { println(it) } // Outputs: 11, 22, 33
Click to reveal answer
intermediate
Explain what happens when one flow emits faster than the other in combine.
In combine, whenever any flow emits a new value, it combines that with the latest value from the other flow, even if the other flow hasn't emitted recently. This means faster emissions trigger more combined outputs.
Click to reveal answer
intermediate
What is a practical use case for using combine over zip in Kotlin flows?
Use combine when you want to react to changes from multiple sources independently, like updating UI with latest user input and network status, without waiting for both to emit simultaneously.
Click to reveal answer
What happens if one flow emits more items than the other when using zip?
AAn error is thrown.
BAll items from both flows are emitted regardless.
CThe flow with fewer items repeats its last value.
DThe extra items are ignored after the shortest flow ends.
✗ Incorrect
zip stops emitting when the shortest flow ends, so extra items from the longer flow are ignored.
Which operator emits a new combined value every time any flow emits?
Acombine
BflatMapConcat
Cmerge
Dzip
✗ Incorrect
combine emits on any new emission from either flow, using the latest values.
In Kotlin flows, what does zip require to emit a combined value?
AOnly one flow needs to emit.
BBoth flows must have emitted at least one value each.
CBoth flows must emit a new value at the same time.
DFlows must be merged first.
✗ Incorrect
zip pairs elements one by one, so it needs both flows to have emitted values to combine.
Which operator would you use to combine a flow of user input with a flow of network status to update UI reactively?
Acombine
Bzip
Cfilter
Dmap
✗ Incorrect
combine is best for reacting to changes from multiple sources independently.
What is the output of this code?
val f1 = flowOf(1, 2)
val f2 = flowOf(10, 20, 30)
f1.zip(f2) { a, b -> a * b }.toList()
A[1, 2]
B[10, 20, 30]
C[10, 40]
D[10, 20]
✗ Incorrect
zip pairs first two elements: 1*10=10, 2*20=40; third element 30 is ignored.
Describe the difference between zip and combine when working with Kotlin flows.
Think about when each operator emits combined values.
You got /4 concepts.
Give an example scenario where combine is more useful than zip.
Consider flows that emit at different speeds.
You got /3 concepts.
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
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.
Step 2: Compare with other options
combine merges latest values on any emission, not zip. Other options describe different behaviors.
Final Answer:
Pairs values one by one from both flows, emitting pairs only when both have emitted. -> Option A
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
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.
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.
Final Answer:
flowA.combine(flowB) { a, b -> a + b } -> Option A
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
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.
Step 2: Determine output pairs
Pairs: (1, "A"), (2, "B"), (3, "C"). The extra "D" in flow2 is ignored.
Final Answer:
1A
2B
3C -> Option B
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
Step 1: Check for common mistakes with combine
combine is an extension function requiring import from kotlinx.coroutines.flow.
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.
Final Answer:
Missing import for combine; add import kotlinx.coroutines.flow.combine -> Option D
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
Step 1: Understand the requirement
You want to emit combined latest values whenever either flow emits, not just pair one by one.
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.
Final Answer:
Use combine because it emits on any flow emission with latest values from both. -> Option C
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 unknownstrongwhile earning +1 Grip toward your certificate.