I have two streams, Stream<A>
and Stream<B>
. I have a constructor for a type C
that takes an A
and a B
. How do I merge the two Stream
s into a Stream<C>
?
You can use StreamZip
in package:async
to combine two streams into one stream of pairs, then create the C
objects from that.
import "package:async" show StreamZip;
...
Stream<C> createCs(Stream<A> as, Stream<B> bs) =>
new StreamZip([as, bs]).map((ab) => new C(ab[0], ab[1]));
import 'dart:async' show Stream;
import 'package:async/async.dart' show StreamGroup;
main() async {
var s1 = stream(10);
var s2 = stream(20);
var s3 = StreamGroup.merge([s1, s2]);
await for(int val in s3) {
print(val);
}
}
Stream<int> stream(int min) async* {
int i = min;
while(i < min + 10) {
yield i++;
}
}
See also http://news.dartlang.org/2016/03/unboxing-packages-async-part-2.html
prints
10
20
11
21
12
22
13
23
14
24
15
25
16
26
17
27
18
28
19
29
If you need to react when either Stream<A>
or Stream<B>
emits an event and use the latest value from both streams, use combineLatest
.
Stream<C> merge(Stream<A> streamA, Stream<B> streamB) {
return streamA
.transform(combineLatest(streamB, (a, b) => new C(a, b)));
}
来源:https://stackoverflow.com/questions/36571924/how-can-i-merge-multiple-streams-into-a-higher-level-stream