Stream.distinct în Dart

Sare peste o valoare dacă este egală cu valoarea emisă imediat înainte (elimină repetările consecutive).

Sintaxă
Stream<T> distinct([bool equals(T previous, T next)?])

Ce face Stream.distinct

distinct compară fiecare valoare cu ultima valoare emisă; dacă sunt egale, o ignoră. Nu elimină toate duplicatele, ca un Set, ci doar repetările consecutive.

Cu funcția equals poți decide tu când două valori sunt „la fel”, de exemplu după un singur câmp sau cu o toleranță.

Parametri

Parametru Descriere
equals Opțional: funcția care spune dacă două valori consecutive sunt egale.

Ce returnează

Un Stream<T> nou.

Exemple

Exemplul 1: Starea conexiunii, fără repetări

Future<void> main() async {
  final stari = Stream.fromIterable(['online', 'online', 'offline', 'offline', 'online', 'offline']);
  print(await stari.distinct().toList());
}

Rezultat

[online, offline, online, offline]

Exemplul 2: Temperatura afișată doar la o schimbare de cel puțin 1 grad

Future<void> main() async {
  final citiri = Stream.fromIterable([20.1, 20.4, 20.9, 21.3, 21.5, 23.0]);
  final afisate = citiri.distinct((anterior, urmator) => (urmator - anterior).abs() < 1);
  print(await afisate.toList());
}

Rezultat

[20.1, 21.3, 23.0]

Greșeli frecvente

  • Te aștepți ca distinct să elimine toate duplicatele. Elimină doar valorile egale cu cea de dinainte; pentru unicitate completă, folosește toSet().

Comenzi înrudite

  • Stream.where: Creează un stream nou care lasă să treacă doar valorile pentru care testul este adevărat.
  • Stream.toList: Adună toate valorile stream-ului într-o listă (sau într-un set) când stream-ul se închide.
  • Set: Colecție fără elemente duplicate: fiecare valoare apare o singură dată, iar căutarea este rapidă.