Sobes.tech
Middle

Jakie operatory istnieją w Flow?

sobes.tech AI

Odpowiedź od AI

Oto główne operatory Flow, pogrupowane według kategorii:

Transformacja:

  • map: Zastosowuje funkcję transformacji do każdej wartości.
  • filter: Filtruje wartości niepasujące do predykatu.
  • take: Pobiera tylko pierwsze N wartości.
  • drop: Pomija pierwsze N wartości.
  • transform: Bardziej elastyczny operator do transformacji z jednego Flow na inny, emitując zero lub więcej wartości dla każdej wartości wejściowej.

Łączenie:

  • zip: Łączy wartości dwóch Flow parami.
  • combine: Łączy ostatnie wartości dwóch Flow.
  • merge: Łączy wartości z kilku Flow w jeden.

Wygładzanie (Flattening):

  • flattenConcat: Łączy Flow z Flow, przetwarzając wewnętrzne Flow sekwencyjnie.
  • flattenMerge: Łączy Flow z Flow, przetwarzając wewnętrzne Flow równolegle (z ograniczeniem współbieżności).

Obsługa wyjątków:

  • catch: Przechwytuje wyjątki i wykonuje akcję lub zwraca wartość awaryjną.
  • retry: Powtarza Flow w przypadku wystąpienia wyjątku.

Operatory końcowe:

  • collect: Zbiera wszystkie wartości z Flow.
  • reduce: Agreguje wartości Flow do jednej.
  • toList: Konwertuje Flow na listę.
  • first: Pobiera tylko pierwszą wartość.
  • single: Pobiera pojedynczą wartość (rzuca wyjątek, jeśli jest więcej niż jedna).

Operatory czasu (często z kotlinx.coroutines.flow.operators):

  • debounce: Emituje wartość tylko po przerwie w emisji.
  • sample: Emituje ostatnią wartość w interwale czasowym.
  • throttle: Ogranicza szybkość emisji wartości.

Przykład użycia map:

flowOf(1, 2, 3)
    .map { it * 2 } // Zamienia 1, 2, 3 na 2, 4, 6
    .collect { println(it) }

Przykład użycia filter:

flowOf("apple", "banana", "cherry")
    .filter { it.startsWith("b") } // Filtruje, pozostawiając tylko "banana"
    .collect { println(it) }

Przykład użycia zip:

val numbers = flowOf(1, 2, 3)
val letters = flowOf("a", "b", "c")
numbers.zip(letters) { number, letter -> "$number$letter" } // Łączy w "1a", "2b", "3c"
    .collect { println(it) }