Sobes.tech
Middle

Ποιοι είναι οι χειριστές στο Flow;

sobes.tech AI

Απάντηση από AI

Ακολουθούν οι κύριοι χειριστές του Flow, ομαδοποιημένοι ανά κατηγορία:

Μετασχηματισμός:

  • map: Εφαρμόζει μια λειτουργία μετασχηματισμού σε κάθε τιμή.
  • filter: Φιλτράρει τις τιμές που δεν πληρούν το predicate.
  • 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) }