컬렉션은 객체들의 그룹을 나타내는 객체이다.
일반적인 collection 타입은 List, Set, Map이다.
순차적으로 접근할 수 있는 요소의 컬렉션
다트에서는 Iterable은 추상클래스이다. 그래서 주로 추상클래스를 List, Set을 만듦으로써 구현한다.
즉, List와 Set은 Iterable의 메소드나 프로퍼티를 사용할 수 있다.
하지만 Map은 다른구조를 사용한다. 예를들어 HashMap은 hash table을 키로 사용한다. Map의 요소는 entries나 values 프로퍼티를 통해 Iterable 객체로 읽을 수 있다.
Iterable<int> iterable = [1,2,3];
Iterable List와 List의 차이점 : 인덱스로 요소에 접근하는것을 보장하지 않는다.
Iterable은 [] 오퍼레이터를 사용하지 못한다.
대신 elementAt() 메소드를 이용하여 접근할 수 있다.
또한, for-in를 통해 접근 가능하다.
첫번째, 마지막 데이터에 접근방법 : first, last 프로퍼티 이용하기.
Iterable의 last는 모든 요소를 건너야 함으로, 느릴 수 있다. 또한 last, first 프로퍼티가 비어 있다면, StateError가 나온다.
조건에 맞는 첫번째 값 찾기.
bool predicate(String element) {
return element.length > 5;
}
void main() {
const items = ['Salad', 'Popcorn', 'Toast', 'Lasagne'];
// You can find with a simple expression:
var element1 = items.firstWhere((element) => element.length > 5);
print(element1);
// Or try using a function block:
var element2 = items.firstWhere((element) {
return element.length > 5;
});
print(element2);
// Or even pass in a function reference:
var element3 = items.firstWhere(predicate);
print(element3);
// You can also use an `orElse` function in case no value is found!
var element4 = items.firstWhere(
(element) => element.length > 10,
orElse: () => 'None!',
);
print(element4);
}
Quick
요소 하나를 찾는다. firstWhere()와 비슷하지만 한개 이상 혹은 아예 요소가 없으면 StateError를 던진다.
SingleWhere()는 모든 iterable의 데이터에 접근한다. 그러므로, 무한대의 iterable 혹은 매우 큰 요소에 대해서는 문제가 생길 수 있다.
Iterable의 모든 요소에 대한 valdation은 every()를 이용한다.
조건을 만족하는 모든 요소들을 찾기 위해서 where()를 사용하라
var evenNumbers = numbers.where((number) => number.isEven);
where는 값을 찾지 못해도 StateError를 throw하지 않는다.
Iterable의 모든 요소에 대해 어떤 함수를 적용하여 새로운 것으로 대체한다.
Iterable<int> output = numbers.map((number) => number * 10);
map() 함수는 lazy 이터러블이다. 그래서 제공된 함수는 iterated될 때, 호출된다.