我有以下功能,将通过接受
int?
返回String
。
int? convert(String s) {
// Some implementation
}
然后我有这个函数可以将
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])
或者,您可以在
stream_transformDart 开发包中使用
whereType<T>()
,像这样:
import 'package:stream_transform/stream_transform.dart';
Stream<int> convertStream(Stream<String> s) {
return s
.map<int?>((i) => convert(i))
.whereType<int>(); // <--
}