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ă.