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

问题描述 投票:0回答:2

我有以下功能,将通过接受

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

我觉得这种方式不太好。有没有其他方法可以用来实现相同的行为?

dart option-type
2个回答
7
投票

你的代码是正确的。

不像

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])

1
投票

或者,您可以在

stream_transform
Dart 开发包中使用whereType<T>(),像这样:

import 'package:stream_transform/stream_transform.dart';

Stream<int> convertStream(Stream<String> s) {
  return s
    .map<int?>((i) => convert(i))
    .whereType<int>(); // <--
}
© www.soinside.com 2019 - 2024. All rights reserved.