dart - 将窗口函数应用于 Dart 流
问题描述
我对 Dart 还很陌生,而且我的头还在流中。具体来说,我很难找到制作函数的正确方法,该函数从流中获取 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方法。
按计数缓冲来自源 Stream 的多个值,然后发出缓冲区并清除它,并启动一个新缓冲区...
这是一个例子:
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();
推荐阅读
- javascript - 显示/隐藏文本输入边框的 Javascript
- r - 为惩罚模型写一个循环
- python - 更改 Scrapy 下载图像名称
- ruby-on-rails - 将我正在创建的对象的 ID 保存在另一个对象的外键中
- java - 从 Firebase 数据库中查找最后 50 个节点的最大值
- c# - 如何从具有特定日期时间范围的数据库中获取数据
- python - 如何使左侧栏中的内容可折叠
- android - 如何将双[]转换为双[]?
- jquery - 制作 PWA,我可以使用 bootstrap+jquery 吗?
- graphql - Prisma:我们如何按 Childs 的数量排序?(GraphQL)