После того, как я исследовал несколько методов, чтобы объединить Stream<Stream<T>>
в один Stream<T>
, я обнаружил, что есть несколько способов сделать это. Здесь я перечислю их:
1. Используя чистый дротик
Как ответил @ Ирн , это чистое решение для дротиков:
Stream<T> flattenStreams<T>(Stream<Stream<T>> source) async* {
await for (var stream in source) yield* stream;
}
Stream<int> getStream(String v) {
return Stream.fromIterable([1, 2, 3, 4]);
}
void main() {
List<String> list = ["a", "b", "c"];
Stream<int> s = flattenStreams(Stream.fromIterable(list).map(getStream));
s.listen(print);
}
Выходы: 1 2 3 4 1 2 3 4 1 2 3 4
2. Использование Observable.flatMap
Observable имеет метод flatMap, который выравнивает выходной поток и присоединяет его к текущему потоку:
import 'package:rxdart/rxdart.dart';
Stream<int> getStream(String v) {
return Stream.fromIterable([1, 2, 3, 4]);
}
void main() {
List<String> list = ["a", "b", "c"];
Observable<int> s = Observable.fromIterable(list).flatMap(getStream);
s.listen(print);
}
Выходы: 1 2 3 4 1 2 3 4 1 2 3 4
3. Использование Observable.switchLatest
Преобразование потока, который испускает потоки (иначе говоря, «поток более высокого порядка»), в один наблюдаемый объект, который испускает элементы, испускаемые последним из этих потоков.
Это решение, которое я искал! Мне просто нужен последний вывод, испускаемый внутренним потоком.
import 'package:rxdart/rxdart.dart';
Stream<int> getStream(String v) {
return Stream.fromIterable([1, 2, 3, 4]);
}
void main() {
List<String> list = ["a", "b", "c"];
Observable<int> s = Observable.switchLatest(
Observable.fromIterable(list).map(getStream));
s.listen(print);
}
Выходы: 1 1 1 2 3 4