如何将Stream<T?>转换为Stream<T>

我有以下函数将int?通过接受返回String

int? convert(String s) {
  // Some implementation
}

然后我有这个函数可以将 a 转换Stream<String>Stream<int>. 我当前的实现如下所示。

Stream<int> convertStream(Stream<String> s) {
  return s
    .map<int?>((i) => convert(i))
    .where((i) => i!=null)
    .map<int>((i) => i!);
}

这种方式对我来说并不好看。有没有其他方法可以用来实现相同的行为?

回答

你的代码是正确的。

与 不同IterableStream没有whereType方法。所以你不能这样做s.map(convert).whereType<int>()

您可以替换.map<int>((i) => i!).cast<int>().

或者,您可以使用一种async*方法:

Stream<int> convertStream(Stream<String> input) async* {
  await for (var s in input) {
    var i = convert(s);
    if (i != null) {
      yield i;
    }
  }
}

编辑:根据@lrn 的建议,您还可以使用expand

stream.expand<int>((int? v) => v == null ? [] : [v])


以上是如何将Stream&lt;T?&gt;转换为Stream&lt;T&gt;的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>