如何将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
二维码