void main() {
List<String> rapper = ["빈지노", "도끼", "더콰이엇", "창모"];
final newList = rapper.where((name) => name == "빈지노");
// newList = ("빈지노")
}
where()는 List에 있는 있는 값들을 순서대로 순회 하면서 특정 조건에 맞는 값만 필터링하는데 사용한다. 매개변수에 함수를 입력해야 한다. 위의 경우 name 안에는 리스트를 순차적으로 돌면서 얻은 값이 들어가게 된다. 각 값별로 비교한 결과를 같으면 true를 다르면 false를 반환하면서 값을 버린다. 순회가 완료되면 true를 반환한 값들을 유지한채 Iterable이 반환된다.
이터러블(Iterable)
이터러블은 추상 클래스로 List나 Set등의 컬렉션 타입들이 상속받는 클래스입니다.
쉽게 설명하자면 컬렉션들이 공통으로 사용하는 기능들을 정의해둔 클래스입니다.
where()나 map()등 순서가 있는 값을 반환할 때 사용합니다.
( newList.toList() List타입으로 다시 변환할 때 사용한다. )
void main() {
List<String> rapper = ["빈지노", "도끼", "더콰이엇", "창모"];
final allMembers = rapper.reduce((value, element) => value + ', ' + element);
// allMembers(String) = "빈지노, 도끼, 더콰이엇, 창모"
}
reduce() 함수 또한 List에 있는 값들을 순회하면서 매개변수에 입력된 함수를 실행한다.
하지만, reduce()의 경우 순회할 때마다 값을 쌓아가는 특징이 있습니다. 또한 reduce()의 반환값은 Iterable이 아닌 List 멤버의 타입을 따른다.
위 코드에 쓰여있는 value는 앞의 값을 element는 뒤의 값을 가져옵니다. 후의 둘이 합쳐진 값이 다시 value에 들어가고 다음 값이 element에 들어가게 된다.
1) value = "빈지노", element = "도끼"
2) value = "빈지노, 도끼", element = "더콰이엇" ..
이런 과정을 통하기 때문에 reduce() 함수는 리스트 내부의 값을 점차 더해지는 기능으로 사용된다.
void main() {
List<String> rapper = ["빈지노", "도끼", "더콰이엇", "창모"];
final collections = rapper.map((name) => '국힙 $name');
// collections = (국힙 빈지노, 국힙 도끼, 국힙 더콰이엇, 국힙 창모)
}
map() 함수는 List에 있는 값들을 순서대로 순회하면서 값을 변경할 수 있다.
함수를 입력해야 하면 함수는 기존 값을 하나씩 매개변수로 입력 받는다.
반환하는 값이 현재값을 대체하며 순회가 끝나면 Iterable이 반환된다.
void main() {
List<String> rapper = ["빈지노", "도끼", "더콰이엇", "창모"];
final allMember = rapper.fold<int>(0, (value, element) => value + element.length());
// allMember = 11
}
fold() 함수는 reduce() 함수와 실행되는 노리는 똑같다. 하지만 reduce() 같은 경우 함수가 실행되는 리스트 요소들의 타입이 같아야 하지만, fold()는 어떠한 타입이든 반환할 수 있다.
첫 번째 매개변수에 시작할 값을 지정하고, 두 번째 매개변수에는 reduce() 함수와 같이 작동하는 함수를 입력한다. 하지만 첫 번째 순회 때 매개변수에는 fold()함수의 첫 번째 매개변수에 입력된 초깃값으로 사용된다. element는 reduce()와 만찬가지로 리스트의 다음 값이 입력된다.
1) value = 0, element = 3,
2) value = 3, element = 2,
3) value = 5, element = 4 ...