Intereting Posts
RxJava2 Может быть возвращено пустое Наблюдаемое, если ни один элемент FirebaseListAdapter игнорирует orderByChild () и equalTo () Просмотр Recycler не плавно прокручивается Идиоматический способ пролитой последовательности в три списка с использованием Kotlin Как найти вид в headerLayout android kotlin Почему инициализаторы свойств не вызывают пользовательский сеттер? База данных объектов, перекрывающая вставленные объекты Android RxJava onNext вызывается, даже если наблюдатель не подписан Использовать NumberFormat.getCurrency в Kotlin Android Эллипсис-оператор эквивалентности Java в Котлине Могу ли я написать sampleVideoView? = findViewById <VideoView> (R.id.videoView) в Котлине? Обработка изменяемых переменных в нескольких функциях в Kotlin Android Ошибка: выполнение выполнено для задачи ': app: clean'. Не удалось удалить файл «Недопустимое имя поля BSON» во время upsert Автоматический ввод кода Kotlin в шаблон делегирования

Поток в котлин

  • Как Котлин будет работать над следующим кодом?
  • Будет ли создаваться коллекция из 5000000 целых чисел как временная коллекция или будет ли фильтр сразу же forEach результат в значение forEach что означает, что будут рассмотрены только 20 целых чисел?
  • Если нет, как мне удастся избежать промежуточной коллекции?

Код:

 class Tests { @Test fun test() { var counter = 0 (1..10_000_000).filter { it % 2 == 1 }.forEach { counter++ if (counter > 10) return } } } 

В примере кода используются операции с Iterable<T> , которые работают с нетерпением: .filter { ... } обрабатывает весь диапазон и создает список, в котором .filter { ... } промежуточные результаты.

Чтобы изменить это, рассмотрите возможность использования Sequence<T> (например, с .asSequence() ), которая работает лениво, так что промежуточные операции, такие как .filter { ... } производят другую ленивую последовательность и выполняют только работу, когда элементы запрашиваются терминальные операции, такие как .forEach { ... } :

 (1..10000000).asSequence() .filter { it % 2 == 1 } .forEach { /* ... */ } 

См .: Итерабельность и последовательность Котлина выглядят точно так же. Почему требуются два типа?

Вы действительно можете увидеть ответ на свой вопрос довольно быстро, просто добавив println(it) в filter :

 //... .filter { println(it) it % 2 == 1 } //... 

Вы увидите каждое напечатанное число. Это потому, что ваша обработка работает с нетерпением, как объяснено здесь .

Как уже было (1..10_000_000).asSequence() , ленивые последовательности для спасения: (1..10_000_000).asSequence()

Теперь, println(it) в filter будет печатать только числа 1..21 , что определенно предпочтительнее в вашем примере.