如何将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!);
}
这种方式对我来说并不好看。有没有其他方法可以用来实现相同的行为?
回答
你的代码是正确的。
与 不同Iterable,Stream没有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])
THE END
二维码