在 Dart 中,将 Iterable 转换为 Stream 的 best/shortest 方法是什么?
What is the best/shortest way to convert an Iterable to a Stream, in Dart?
我有一个 Iterable,我想将它转换为 Stream。做这个最efficient/shortest-amount-of-code是什么?
例如:
Future convert(thing) {
return someAsyncOperation(thing);
}
Stream doStuff(Iterable things) {
return things
.map((t) async => await convert(t)) // this isn't exactly what I want
// because this returns the Future
// and not the value
.where((value) => value != null)
.toStream(); // this doesn't exist...
}
注意:iterable.toStream() 不存在,但我想要类似的东西。 :)
这是一个简单的例子:
var data = [1,2,3,4,5]; // some sample data
var stream = new Stream.fromIterable(data);
使用您的代码:
Future convert(thing) {
return someAsyncOperation(thing);
}
Stream doStuff(Iterable things) {
return new Stream.fromIterable(things
.map((t) async => await convert(t))
.where((value) => value != null));
}
如果您使用的是 Dart SDK 1.9 版或更新版本,您可以使用 async*
轻松创建流
import 'dart:async';
Future convert(thing) {
return new Future.value(thing);
}
Stream doStuff(Iterable things) async* {
for (var t in things) {
var r = await convert(t);
if (r != null) {
yield r;
}
}
}
void main() {
doStuff([1, 2, 3, null, 4, 5]).listen(print);
}
也许它更容易阅读,因为它有更少的大括号和 "special" 方法,但这是一个品味问题。
如果你想按顺序处理 iterable 中的每个项目,你可以使用 Stream.asyncMap
:
Future convert(thing) {
return waitForIt(thing); // async operation
}
f() {
var data = [1,2,3,4,5];
new Stream.fromIterable(data)
.asyncMap(convert)
.where((value) => value != null))
}
我有一个 Iterable,我想将它转换为 Stream。做这个最efficient/shortest-amount-of-code是什么?
例如:
Future convert(thing) {
return someAsyncOperation(thing);
}
Stream doStuff(Iterable things) {
return things
.map((t) async => await convert(t)) // this isn't exactly what I want
// because this returns the Future
// and not the value
.where((value) => value != null)
.toStream(); // this doesn't exist...
}
注意:iterable.toStream() 不存在,但我想要类似的东西。 :)
这是一个简单的例子:
var data = [1,2,3,4,5]; // some sample data
var stream = new Stream.fromIterable(data);
使用您的代码:
Future convert(thing) {
return someAsyncOperation(thing);
}
Stream doStuff(Iterable things) {
return new Stream.fromIterable(things
.map((t) async => await convert(t))
.where((value) => value != null));
}
如果您使用的是 Dart SDK 1.9 版或更新版本,您可以使用 async*
轻松创建流import 'dart:async';
Future convert(thing) {
return new Future.value(thing);
}
Stream doStuff(Iterable things) async* {
for (var t in things) {
var r = await convert(t);
if (r != null) {
yield r;
}
}
}
void main() {
doStuff([1, 2, 3, null, 4, 5]).listen(print);
}
也许它更容易阅读,因为它有更少的大括号和 "special" 方法,但这是一个品味问题。
如果你想按顺序处理 iterable 中的每个项目,你可以使用 Stream.asyncMap
:
Future convert(thing) {
return waitForIt(thing); // async operation
}
f() {
var data = [1,2,3,4,5];
new Stream.fromIterable(data)
.asyncMap(convert)
.where((value) => value != null))
}