代码之家  ›  专栏  ›  技术社区  ›  Ramesh-X Wen-Shan Wendy Chow

如何转换Stream<T?>流式传输<T>

  •  0
  • Ramesh-X Wen-Shan Wendy Chow  · 技术社区  · 3 年前

    我有以下函数将返回 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!);
    }
    

    这种方式对我来说不太好。还有其他方法可以用来实现同样的行为吗?

    0 回复  |  直到 1 年前
        1
  •  7
  •   Alexandre Ardhuin    3 年前

    你的代码是正确的。

    不像 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])
    
        2
  •  1
  •   keplerian    3 年前

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

    import 'package:stream_transform/stream_transform.dart';
    
    Stream<int> convertStream(Stream<String> s) {
      return s
        .map<int?>((i) => convert(i))
        .whereType<int>(); // <--
    }