【问题标题】:Applying a windowing function to a Dart stream将窗口函数应用于 Dart 流
【发布时间】:2021-04-27 22:55:12
【问题描述】:

我对 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;
      }
    }
  }
}

【问题讨论】:

    标签: dart dart-async dart-stream


    【解决方案1】:

    查看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();
    

    【讨论】:

    • 啊,聪明,是的,我一直在寻找一个可以窗口化的通用解决方案,希望在 dart 标准库中的某些东西,但我猜 rxdart 的 bufferCount 是最接近窗口函数的东西。也感谢在asInt32List 上添加的提示,干杯!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-06
    • 1970-01-01
    • 2018-02-09
    • 1970-01-01
    • 2014-05-11
    相关资源
    最近更新 更多