将窗口函数应用于 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;
      }
    }
  }
}

解决方法

查看 bufferCount 包中的 RxDart 方法。

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

这是一个例子:

import 'dart:typed_data';

import 'package:rxdart/rxdart.dart';

main() {
  var bytes = Uint8List.fromList([255,1,2,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();

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...