dart 如何把Flume改造< T>成Flume< V>?

eivgtgni  于 2022-12-16  发布在  Flume
关注(0)|答案(2)|浏览(297)

我有一个方法可以将其输出发送到给定的Sink<Node>中。
我想把它导入stdout,也就是Sink<List<int>>
假设我有一个函数convert,它可以将Node转换为List<int>,我如何将stdout转换为Sink<Node>,以便它将我的树打印到控制台?

5gfr0r5j

5gfr0r5j1#

我已经做了这个例子来展示如何使用StreamController来实现这一点:

import 'dart:async';
import 'dart:convert';
import 'dart:io';

class Message {
  String text;
  Message(this.text);
}

void main() {
  final controller = StreamController<Message>();
  stdout.addStream(controller.stream
      .map((var msg) => msg.text)
      .transform(const Utf8Encoder()));

  var messageSink = controller.sink;
  messageSink.add(Message('Hello World'));
}

此示例中的StreamController获取Message对象并将其转换为List<int>,方法是首先使用mapMessage转换为String对象,然后使用转换器将String转换为UTF8字节的List。

kiayqfof

kiayqfof2#

我已提交:https://github.com/dart-lang/sdk/issues/50607
下面是我解决这个问题的方法:

class _MappedSink<From, To> implements Sink<From> {
  final To Function(From) _transform;
  final Sink<To> _sink;
  const _MappedSink(this._sink, this._transform);

  @override
  void add(From data) => _sink.add(_transform(data));
  @override
  void close() => _sink.close();
}

extension SinkMap<To> on Sink<To> {
  Sink<From> map<From>(To Function(From) transform) =>
      _MappedSink(this, transform);
}

相关问题