对Dart流应用窗口函数



我对Dart还是个新手,对streams还是个新手。具体来说,我很难找到合适的方法来创建一个函数,该函数从流中获取N个元素的窗口,对其应用函数并重新流结果。

为了澄清我的意思,我列举了一个我自己实现的例子,这个例子让我想到了这个问题。该代码从文件中获取字节流并将4个字节块转换为整数流。通过使用await for,我能够完成我想要的,但我正在寻找一个更习惯的基于流的函数来完成同样的事情,更简洁。

Stream<int> loadData(String path) async* {
final f = File(path);
final byteStream = f.openRead();
var buffer = Uint8List(8);
var i = 0;

// This is where I would like to use a windowing function
await for(var bs in byteStream) {
for(var b in bs) {
buffer[i++] = b;
if(i == 8)  {
var bytes = new ByteData.view(buffer.buffer);
yield bytes.getUint16(0);
i = 0;
}
}
}
}

查看RxDart包中的bufferCount方法。

通过计数从源流中缓冲一些值,然后发出缓冲区并清除它,并开始一个新的缓冲区…

下面是一个例子:

import 'dart:typed_data';
import 'package:rxdart/rxdart.dart';
main() {
var bytes = Uint8List.fromList([255, 0, 0, 0, 0, 1, 0, 0, 1, 1, 0, 0, 2, 1, 0, 0]);
Stream<int>.fromIterable(bytes)
.bufferCount(4)
.map((bytes) => Uint8List.fromList(bytes).buffer)
.map((buffer) => ByteData.view(buffer).getInt32(0, Endian.little))
.listen(print); // prints 255 256 257 258
}

值得注意的是,这个特定的任务可以更容易地执行:

bytes.buffer.asInt32List();

相关内容

  • 没有找到相关文章

最新更新