我有两个流Stream<A>
和Stream<B>
。我有一个C
类型的构造函数,它带有A
和B
。如何将两个Stream
合并为Stream<C>
?
答案 0 :(得分:11)
您可以使用StreamZip
中的package:async
将两个流合并为一个对的流,然后从中创建C
个对象。
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]));
答案 1 :(得分:6)
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++;
}
}
另见http://news.dartlang.org/2016/03/unboxing-packages-async-part-2.html
打印
10
20
11
21
12
22
13
23
14
24
15
25
16
26
17
27
18
28
19
29
答案 2 :(得分:2)
如果您需要在Stream<A>
或Stream<B>
发出事件并使用两个流中的最新值时做出反应,请使用combineLatest
。
Stream<C> merge(Stream<A> streamA, Stream<B> streamB) {
return streamA
.transform(combineLatest(streamB, (a, b) => new C(a, b)));
}
答案 3 :(得分:2)
适用于需要合并两个以上不同类型的流并获取任何流的每次更新的所有最新值的人。
import 'package:stream_transform/stream_transform.dart';
Stream<List> combineLatest(Iterable<Stream> streams) {
final Stream<Object> first = streams.first.cast<Object>();
final List<Stream<Object>> others = [...streams.skip(1)];
return first.combineLatestAll(others);
}
合并后的流将产生:
streamA: a----b------------------c--------d---|
streamB: --1---------2-----------------|
streamC: -------&----------%---|
combined: -------b1&--b2&---b2%---c2%------d2%-|
为什么不StreamZip
?因为StreamZip
会产生:
streamA: a----b------------------c--------d---|
streamB: --1---------2-----------------|
streamC: -------&----------%---|
combined: -------a1&-------b2%--|
用法:
Stream<T> sA;
Stream<K> sB;
Stream<Y> sC;
combineLatest([sA, sB, sC]).map((data) {
T resA = data[0];
K resB = data[1];
Y resC = data[2];
return D(resA, resB, resC);
});