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

neskvpey  于 2023-03-05  发布在  其他
关注(0)|答案(2)|浏览(180)

我有下面的函数,它将通过接受String返回int?

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!);
}

我觉得这种方法不太好,有没有其他方法可以达到同样的效果?

yrdbyhpb

yrdbyhpb1#

您的代码是正确的。
不像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])
lf5gs5x2

lf5gs5x22#

或者,您可以在stream_transform Dart dev包中使用whereType<T>(),如下所示:

import 'package:stream_transform/stream_transform.dart';

Stream<int> convertStream(Stream<String> s) {
  return s
    .map<int?>((i) => convert(i))
    .whereType<int>(); // <--
}

相关问题