Что такое эквивалент Kotlin для async enumerable в C # 8?

#kotlin #async-await #kotlin-coroutines

#kotlin #async-await #kotlin-сопрограммы

Вопрос:

В C # 8 теперь есть IAsyncEnumerable. Есть ли эквивалент Kotlin для этого? Например, в C # await foreach(...) теперь вы можете (с IAsyncEnumerable ):

 async Task Main()
{
    await foreach(var dt in new Seconds().Take(10))
    {
        Console.WriteLine(dt);
    }
}

public class Seconds : IAsyncEnumerable<DateTime>
{
    public class FooEnumerator : IAsyncEnumerator<DateTime>
    {
        public DateTime Current { get; set; }
        public async ValueTask DisposeAsync() {}
        public async ValueTask<bool> MoveNextAsync()
        {
            await Task.Delay(1000);
            Current = DateTime.Now;
            return true;
        }
    }

    public IAsyncEnumerator<DateTime> GetAsyncEnumerator(CancellationToken cancellationToken = default)
        => new FooEnumerator(); 
}
  

Ответ №1:

Взгляните на асинхронный поток, который, по-видимому, является ближайшим эквивалентом.

Аналогичный пример может быть:

 fun main() = runBlocking {
    seconds().take(10).collect {
        println(it)
    }
}

fun seconds() = flow<Instant> {
    while (true) {
        delay(1000L)
        emit(Instant.now())
    }
}
  

Я использую kotlinx-coroutines-core версию 1.3.9