You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何编写方法修改Stream<U>后返回Stream<T>并实现类型转换与过滤

错误根源

  • async* 方法中直接 yield 整个Stream对象语法错误,转发Stream元素需使用yield*关键字
  • 你为map传入了async函数,导致转换后得到的是Stream<Future<Submission?>>,和预期返回的Stream<Submission>类型完全不匹配
  • 没有处理转换过滤后返回null的场景,无法满足返回值的非空要求

最优实现方案

使用await for遍历原始Stream,逻辑最清晰,容易调试:

Stream<Submission> getSavedPosts({int limit = 20}) async* {
  await for (final UserContent userContent in _me!.saved(limit: limit)) {
    try {
      final Submission sub = await _populateUserContent(userContent);
      if (_filterPost(sub)) {
        yield sub;
      }
    } catch (err) {
      print(err);
    }
  }
}

链式操作写法

如果你更习惯Stream的链式调用风格,可使用asyncMap+whereType实现:

Stream<Submission> getSavedPosts({int limit = 20}) {
  return _me!.saved(limit: limit)
      .asyncMap((UserContent userContent) async {
        try {
          final Submission sub = await _populateUserContent(userContent);
          return _filterPost(sub) ? sub : null;
        } catch (err) {
          print(err);
          return null;
        }
      })
      .whereType<Submission>();
}

内容的提问来源于stack exchange,提问作者Remo Herzog

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 07:36:04