创建需要从另一个Stream聚合多个事件的Stream的最佳方法是什么?
我的目标是创建一个流,该流从另一个流中聚合事件,直到它有足够的事件来构建消息为止。以我为例,我正在从Socket流中读取数据,因此一条消息可能会分布在不同的事件中,并且一个事件可能包含各种消息的数据,因此我不能只对每个元素应用map操作。
似乎正确的方法是使用Stream Transformer,但我在查找有关如何正确实施且没有太多样板代码的信息时遇到了麻烦。
在阅读了有关如何创建流的信息之后,我想出了一个解决方案,但是我不确定这是否可以接受,也不是实现它的最佳方法。
这是我的解决方案示例:
Stream<String> joinWordsIfStartWithC(Stream<String> a) async* {
var prevWord= '';
await for (var i in a) {
prevWord += i;
if(i.startsWith('C')){
yield prevWord;
prevWord = '';
}
}
}
Stream<String> periodicStream(Duration interval) async* {
while (true) {
await Future.delayed(interval);
yield 'C';
yield 'A';
yield 'B';
yield 'C';
yield 'C';
yield 'B';
yield 'C';
}
}
void main(List<String> arguments) async {
var intStream = periodicStream(Duration(seconds: 2));
var sStream = joinWordsIfStartWithC(intStream);
sStream.listen((s) => print(s));
}
我会说您的解决方案似乎很好,但是如果您想制作一个流转换器,可以通过从StreamTransformerBase
扩展而来很容易:
StreamTransformerBase