Sobes.tech
Middle

Quali operatori esistono in Flow?

sobes.tech AI

Risposta dell'AI

Ecco i principali operatori di Flow, raggruppati per categorie:

Trasformazione:

  • map: Applica una funzione di trasformazione a ogni valore.
  • filter: Filtra i valori che non soddisfano il predicato.
  • take: Prende solo i primi N valori.
  • drop: Ignora i primi N valori.
  • transform: Operatore più flessibile per trasformare da un Flow a un altro, emettendo zero o più valori per ogni valore in ingresso.

Combinazione:

  • zip: Combina i valori di due Flow in coppie.
  • combine: Combina gli ultimi valori di due Flow.
  • merge: Unisce i valori di più Flow in uno solo.

Lisciatura (Flattening):

  • flattenConcat: Combina Flow di Flow, processando i Flow interni sequenzialmente.
  • flattenMerge: Combina Flow di Flow, processando i Flow interni in parallelo (con limitazione di concorrenza).

Gestione delle eccezioni:

  • catch: Intercetta le eccezioni e esegue un'azione o restituisce un valore di emergenza.
  • retry: Riprova il Flow in caso di eccezione.

Operatori terminali:

  • collect: Raccoglie tutti i valori di un Flow.
  • reduce: Aggrega i valori di un Flow in uno solo.
  • toList: Converte un Flow in una lista.
  • first: Prende solo il primo valore.
  • single: Prende un valore singolo (lancia eccezione se ci sono più di uno).

Operatori di tempo (spesso di kotlinx.coroutines.flow.operators):

  • debounce: Emissione di un valore solo dopo una pausa nell'emissione.
  • sample: Emissione dell'ultimo valore a intervalli di tempo.
  • throttle: Limita la velocità di emissione dei valori.

Esempio di utilizzo di map:

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

Esempio di utilizzo di filter:

flowOf("apple", "banana", "cherry")
    .filter { it.startsWith("b") } // Filtra, lasciando solo "banana"
    .collect { println(it) }

Esempio di utilizzo di zip:

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