Sobes.tech
Middle

Кои оператори съществуват във Flow?

sobes.tech AI

Отговор от 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 паралелно (с ограничение на конкуренцията).

Обработка на изключения:

  • 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) }