Назад к вопросам
Middle
112
questionbank

Какие существуют операторы в Flow?

Sobes Copilot

Получайте ответы в реальном времени

Ответ от нейросети

sobes.tech AI

Вот основные операторы Flow, сгруппированные по категориям:

Преобразование:

  • map: Применяет функцию преобразования к каждому значению.
  • filter: Отфильтровывает значения, не соответствующие предикату.
  • take: Берет только первые N значений.
  • drop: Пропускает первые N значений.
  • transform: Более гибкий оператор для преобразования из одного Flow в другое, излучая ноль или более значений для каждого входящего значения.

Комбинирование:

  • zip: Объединяет значения двух Flow попарно.
  • combine: Комбинирует последние значения двух Flow.
  • merge: Объединяет значения из нескольких Flow в один.

Сглаживание (Flattening):

  • flattenConcat: Объединяет Flow из Flow, последовательно обрабатывая внутренние Flow.
  • flattenMerge: Объединяет Flow из Flow, параллельно обрабатывая внутренние Flow (с ограничением concurrency).

Обработка исключений:

  • catch: Перехватывает исключения и выполняет действие или возвращает аварийное значение.
  • retry: Повторяет Flow при возникновении исключения.

Терминальные операторы:

  • collect: Собирает все значения из Flow.
  • reduce: Агрегирует значения Flow в одно.
  • toList: Преобразует Flow в список.
  • first: Берет только первое значение.
  • single: Берет единственное значение (выбрасывает исключение, если значений больше одного).

Операторы времени (часто из kotlinx.coroutines.flow.operators):

  • debounce: Излучает значение только после паузы в излучении.
  • sample: Излучает последнее значение через интервал времени.
  • throttle: Ограничивает скорость излучения значений.

Пример использования map:

flowOf(1, 2, 3)
    .map { it * 2 } // Преобразует 1, 2, 3 в 2, 4, 6
    .collect { println(it) }

Пример использования filter:

flowOf("apple", "banana", "cherry")
    .filter { it.startsWith("b") } // Фильтрует, оставляя только "banana"
    .collect { println(it) }

Пример использования zip:

val numbers = flowOf(1, 2, 3)
val letters = flowOf("a", "b", "c")
numbers.zip(letters) { number, letter -> "$number$letter" } // Объединяет в "1a", "2b", "3c"
    .collect { println(it) }