web-dev-qa-db-ja.com

複数のストリームをより高いレベルのストリームにマージするにはどうすればよいですか?

Stream<A>Stream<B>の2つのストリームがあります。 CAをとるタイプBのコンストラクターがあります。 2つのStreamStream<C>にマージするにはどうすればよいですか?

15
Brett

package:asyncStreamZipを使用して、2つのストリームを1つのペアのストリームに結合し、そこから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]));
12
lrn
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
9

いずれかの場合に対応する必要がある場合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
cambunctious