Iterable & Iterator in Flutter & Dart
An in-depth explanation about Iterable & Iterator, Their `methods` & `properties` with Examples.

Search for a command to run...
An in-depth explanation about Iterable & Iterator, Their `methods` & `properties` with Examples.

Thank you for the Feedback saurabh jadhav💙
Lessons from Code, Content, and Consistency

Reliability basics: Outbox pattern + why it matters

Introducing Kafka/Redpanda + move to event-driven workflow

Connect Orders ↔ Inventory (first working service-to-service flow)

Inventory service + gRPC + proto contracts

List, Map, and Set when building an application.

An Iterable is a collection of elements that can be accessed sequentially


index, like numbers[index]. It's because Iterable doesn't have [ ] operator like List.Iterable by [ ], And see what error it throws:
![[notdefine].png](https://cdn.hashnode.com/res/hashnode/image/upload/v1629450579721/Gf8Ke6z0i.png)
List, Set is Implementing Iterable , All the methods that are available in Interable are also accessible in List and Set.Map is different than List and Set, because it contains key : value pairs. We cannot directly loop through the Map variable as we're doing in Set and List. Because Map is not implementing Iterable

keys and values Iterables inside it.

Map we can do something like :
Interface. The for-in loop we've used in the above examples is using this Iterator interface under the hood.Iterator getter inside it. 


moveNext(), which returns a boolean value.true then it means that iterable contains the next element.false then it means that there are no further elements.current. Which gives the current element of the iterable.
first & last:first returns the first value/element from the Iterable.last returns the last value/element from the Iterable.first Example :void main() {
final List<String> listOfCar = ["Audi","BMW","Ferrari","Mercedes"];
print(listOfCar.first);
}

first element from Map :void main() {
final Map<String,dynamic> mapOfNumbers =
{"0":"Zero","1":"One","2":"Two","3":"Three"};
print(mapOfNumbers.values.first);
}

last Example : final List<String> listOfCar = ["Audi","BMW","Ferrari","Mercedes"];
print(listOfCar.last);

isEmpty & isNotEmpty:isEmpty returns true if Iterable is empty, otherwise false.isNotEmpty returns true if Iterable is not empty, otherwise falsevoid main() {
final List<String> listOfCar = ["Audi","BMW","Ferrari","Mercedes"];
print(listOfCar.isEmpty);
}

Mapvoid main() {
final Map<String,dynamic> mapOfNumbers =
{"0":"Zero","1":"One","2":"Two","3":"Three"};
print(mapOfNumbers.isEmpty); // false
}
length :Iterable.void main() {
final Map<String,dynamic> mapOfNumbers =
{"0":"Zero","1":"One","2":"Two","3":"Three"};
final List<String> listOfCar = ["Audi","BMW","Ferrari","Mercedes"];
print("List: "+listOfCar.length.toString());
print("Map: "+mapOfNumbers.length.toString());
}

runtimeType :void main() {
final Map<String,dynamic> mapOfNumbers =
{"0":"Zero","1":"One","2":"Two","3":"Three"};
final List<String> listOfCar = ["Audi","BMW","Ferrari","Mercedes"];
print(listOfCar.runtimeType);
print(mapOfNumbers.runtimeType);
}

single :single returns that value/element.void main() {
final List<String> listOfCar = ["Audi"];
print(listOfCar.single);
}

elementAt(index) :Iterable that we cannot access the element of Iterable by [ ]. Because Iterable doesn't have [ ] defined.elementAt() method to access any element from the Iterable.void main() {
final Map<String,dynamic> mapOfNumbers =
{"0":"Zero","1":"One","2":"Two","3":"Three"};
final Iterable<String> listOfCar = ["Audi","BMW","Ferrari","Mercedes"];
print(listOfCar.elementAt(0));
print(mapOfNumbers.values.elementAt(0));
}

contains(element) :true if the Iterable contains the element passed inside the contains() method.void main() {
final Map<String,dynamic> mapOfNumbers =
{"0":"Zero","1":"One","2":"Two","3":"Three"};
final List<String> listOfCar = ["Audi","BMW","Ferrari","Mercedes"];
print(listOfCar.contains("BMW"));
print(mapOfNumbers.values.contains("Five"));
}

firstWhere()boolean value.orElse function which will be called when no condition is satisfied.void main() {
final List<String> listOfCar = ["Audi","Audi A5","BMW","Ferrari","Mercedes"];
print(listOfCar.firstWhere((element)=> element.startsWith("Au")));
}

orElse void main() {
final List<String> listOfCar = ["Audi","Audi A5","BMW","Ferrari","Mercedes"];
print(listOfCar.firstWhere((element)=> element.startsWith("Zu"),orElse: ()=> "No Element Found"));
}

where()boolean function. void main() {
final List<String> listOfCar = ["Audi","Audi A5","BMW","Ferrari","Mercedes"];
print(listOfCar.where((element)=> element.length > 4));
}

Map:
void main() {
final Map<String,dynamic> mapOfNumbers =
{"0":"Zero","1":"One","2":"Two","3":"Three"};
print(mapOfNumbers.values.where((element)=> element.length > 3));
}

toSet() :T to Set, where T can be : List,Map etc.Set will remove duplicate element from previous iterable.void main() {
final List listOfCar = ["Audi","Audi","BMW","Ferrari","Mercedes"];
print(listOfCar.toSet());
}

toList() :List.growable. If true we can further add elements in list, otherwise add() will not work.void main() {
final Set<String> setOfCar = {"Audi","BMW","Ferrari","Mercedes"};
print(setOfCar.toList());
}

growable : true (default) :void main() {
final Set<String> setOfCar = {"Audi","BMW","Ferrari","Mercedes"};
final List listOfCar = setOfCar.toList();
listOfCar.add("Jeep");
print(listOfCar);
}

growable : false : void main() {
final Set<String> setOfCar = {"Audi","BMW","Ferrari","Mercedes"};
final List listOfCar = setOfCar.toList(growable: false);
listOfCar.add("Jeep");
print(listOfCar);
}

add is not working now.takeWhile() :void main() {
final List<String> listOfCar = ["Audi","Audi A5","BMW","Ferrari","Mercedes","Audi A3"];
final fileteredList = listOfCar.takeWhile((element) => element.startsWith("Au"));
print(fileteredList);
}

take(int count) :void main() {
final List<String> listOfCar = ["Audi","Audi A5","BMW","Ferrari","Mercedes","Audi A3"];
final fileteredList = listOfCar.take(3);
print(fileteredList);
}

skipWhile():void main() {
final List<String> listOfCar = ["Audi","Ferrari","BMW","Mercedes","Audi A3"];
final fileteredList = listOfCar.skipWhile((element)=> element.endsWith("i"));
print(fileteredList);
}

skip(int count) :void main() {
final List<String> listOfCar = ["Audi","Ferrari","BMW","Mercedes","Audi A3"];
final fileteredList = listOfCar.skip(3);
print(fileteredList);
}

singleWhere() :orElsevoid main() {
final List<String> listOfCar = ["Audi","Ferrari","BMW","Mercedes"];
final fileteredList = listOfCar.singleWhere((element)=>
element.startsWith("Au"),orElse:()=> "No Element Found");
print(fileteredList);
}

reduce():iterable to a single value by combining elements of the iterable using a provided function.void main() {
final List<int> listNumber = [1,2,3,4];
final reduced = listNumber.reduce((value,element){
print("value: "+value.toString());
print("element "+element.toString());
return value+element;
});
print("total: "+reduced.toString());
}

map() :map will run on each element.void main() {
final List<int> listNumber = [1,2,3,4];
final filteredList = listNumber.map((element)=> element += 1);
print(filteredList);
}

lastWhere() :void main() {
final List<int> listNumber = [1,2,3,4];
final fileteredElement = listNumber.lastWhere((element)=> element.isEven);
print(fileteredElement);
}

join() :separator and returns it as String.void main() {
final List<int> listNumber = [1,2,3,4];
final fileteredElement = listNumber.join(",");
print(fileteredElement);
}

forEach :forEach will run on every element of the iterable.map and forEach is forEach doesn't return a new list whereas map does.void main() {
final List<int> listNumber = [1,2,3,4];
listNumber.forEach((element)=> print(element * 2));
}

followedBy() :iterable inside your current iterable then you can use followdBy() by passing your iterable inside it.void main() {
final List listOfFruits = ["Apple","Banana","Carrot"];
final newFruitList = listOfFruits.followedBy(["Dates","Emu"]);
print(newFruitList);
}

fold:reduce method. iterable to a single value by iteratively combining each element of the collection with an existing value.void main() {
final List<String> listOfFruits = ["Apple","Banana","Carrot"];
listOfFruits.fold(0, (value, element) {
print("value: "+value.toString());
print("element: "+ element.toString());
return value + element.length;
});
}

reduce and fold is: reduce can only be used on non-empty collections with functions that return the same type as the types contained in the collection whereas fold can be used in all cases.reduce but you can use fold to do that.expand :iterables inside one main iterable and you want to extract out those iterables into one single iterable then you can use expand to do this.void main() {
final nestedList = [["Apple","Banana","Carrot"],[1,2,3],[true,false]];
final flattenedList = nestedList.expand((list)=>list);
print(flattenedList);
}

void main() {
final listOfFruit = ["Apple","Banana","Carrot"];
final duplicateFruits = listOfFruit .expand((element)=>[element,element]);
print(duplicateFruits );
}

every() :void main() {
final listOfFruits = ["Apple","A Banana","A Carrot"];
final filteredList = listOfFruits.every((element) => element.startsWith("A"));
print(filteredList);
}

any() :true if any element satisfies the given condition, otherwise false.void main() {
List<int> listOfNumbers = [11,23,3,45,5];
print(listOfNumbers.any((element)=> element.isEven));
}

cast():castType so that you can use it in places where the analyzer expects Iterable<Type>.iterable.type that it wanted.void main() {
List<num> listOfNumbers = [5, 20, 12.5];
List<double> castedDoubleList = listOfNumbers.cast<double>();
print("casted list: "+castedDoubleList.toString());
print("casted list type: "+castedDoubleList.runtimeType.toString());
print("casted list element type: ");
castedDoubleList.forEach((element)=> print(element.runtimeType));
}

castedDoubleList if any function requires it. For example: void main() {
List<num> listOfNumbers = [5, 20, 12.5];
List<double> castedDoubleList = listOfNumbers.cast<double>();
reverseDoubleList(castedDoubleList);
}
reverseDoubleList(List<double> doubleList){
print(doubleList.reversed);
}

