Когда вам нужно лениво создать последовательность значений, подумайте об использовании функции генератора. Дарт имеет встроенную поддержку двух видов функций генератора:
- Синхронный генератор: возвращает итерируемый объект Iterable.
- Асинхронный генератор: возвращает потоковый объект Stream Stream.
Чтобы реализовать функцию синхронного генератора, пометьте тело функции как sync *
и используйте операторы yield
для доставки значений:
Iterable<int> naturalsTo(int n) sync* {
int k = 0;
while (k < n) yield k++;
}
Чтобы реализовать функцию асинхронного генератора, пометьте тело функции как async *
и используйте операторы yield
для доставки значений:
Stream<int> asynchronousNaturalsTo(int n) async* {
int k = 0;
while (k > n) yield k++;
}
Если ваш генератор рекурсивный, вы можете улучшить его производительность, используя yield *
:
Iterable<int> naturalsDownFrom(int n) sync* {
if (n > 0) {
yield n;
yield* naturalsDownFrom(n - 1);
}
}