Stream.length în Dart

length numără valorile până la închiderea stream-ului; isEmpty spune dacă stream-ul nu are nicio valoare.

Sintaxă
Future<int> get length
Future<bool> get isEmpty

Ce face Stream.length

length ascultă tot stream-ul și numără valorile, deci se termină abia când stream-ul se închide. isEmpty se termină mai repede: cu false imediat ce sosește prima valoare, sau cu true la închidere.

Ambele consumă stream-ul obișnuit, așa că nu-l mai poți citi după aceea. Dacă ai nevoie și de valori, și de număr, citește-le cu toList() și folosește length pe listă.

Ce returnează

Future<int>, respectiv Future<bool>.

Exemple

Exemplul 1: Câte comenzi au venit

Stream<String> comenzi() async* {
  for (final c in ['C1', 'C2', 'C3']) {
    await Future.delayed(const Duration(milliseconds: 5));
    yield c;
  }
}

Future<void> main() async {
  print('Comenzi: ${await comenzi().length}');
  print('Fără comenzi: ${await comenzi().isEmpty}');
  print('Stream gol: ${await const Stream<String>.empty().isEmpty}');
}

Rezultat

Comenzi: 3
Fără comenzi: false
Stream gol: true

Exemplul 2: Valori și număr dintr-o singură citire

Future<void> main() async {
  final s = Stream.fromIterable(['Iași', 'Cluj', 'Sibiu']);
  final orase = await s.toList();
  print('${orase.length} orașe: ${orase.join(', ')}');
}

Rezultat

3 orașe: Iași, Cluj, Sibiu

Greșeli frecvente

  • Chemi length și apoi încerci să citești valorile din același stream. Stream-ul a fost deja consumat.

Comenzi înrudite

  • Stream.toList: Adună toate valorile stream-ului într-o listă (sau într-un set) când stream-ul se închide.
  • Stream.first: first, last, single și elementAt dau un Future cu o anumită valoare din stream: prima, ultima, singura sau a n-a.
  • Iterable.length: length dă numărul de elemente; isEmpty și isNotEmpty spun dacă colecția este goală.