微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

将Stream <Item>转换为Stream <List <Item >>

如何解决将Stream <Item>转换为Stream <List <Item >>

我尝试通过Stream获取文件夹中的所有文件

Directort(path).list()返回Stream<FileSystemEntity>

我要返回Stream<List<FileSystemEntity>>

示例:

1 => 1
2 => 1,2
3 => 1,2,3

解决方法

来自scan

rxdart运算符是最佳答案
https://pub.dev/documentation/rxdart/latest/rx/ScanExtension/scan.html https://rxjs.dev/api/operators/scan

Stream<FileSystemEntity> source$ = ...;

Stream<List<FileSystemEntity>> result$ = source$.scan(
    (acc,element,_) => [...acc,element],[],);
,

您可以使用包装对象来存储列表

以此为起点

class StreamToStreamList<T> {
  StreamToStreamList(this._parent);

  final Stream<T> _parent;
  final _values = <T>[];

  Stream<List<T>> toStream() async* {
    await for (final value in _parent) {
      _values.add(value);
      yield _values;
    }
  }
}

,
  final result = Directory(path)
      // get subentries of the path dir
      .list()
      // getting only sub-directories (assumtion is that you are interested in those only)
      .where((dir) => dir is Directory)
      // casting them to Directory object
      .cast<Directory>()
      // processing each dir getting its sub-entries 
      .map((dir) => dir.listSync())
  ;

编辑:当您希望结果也将文件也作为流中列表的单个元素时的情况:

  final result = Directory(path)
      // get sub-entries of the path dir
      .list()
      // processing each entry so dir entry -> list of dir sub entries and file entry -> list containing one file as single element   
      .map((dir) {
        if(dir is Directory) {
          return dir.listSync();
        } else {
          return [dir];
        }
      })
  ;

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。