티스토리 뷰
컬렉션이란?
컬렉션은 객체 그룹을 나타내는 객체이며, 객체 그룹의 각각의 객체를 요소라고 부른다. 컬렉션은 비어 있을 수도 있고, 여러 요소를 포함할 수도 있다.
가장 일반적인 컬렉션 타입은 다음과 같다.
- 리스트 : 인덱스를 통해 요소를 읽는 데 사용
- 셋 : 중복 없이 요소를 포함하는 데 사용
- 맵 : 키를 사용하여 요소를 읽는 데 사용
Iterable이란?
Iterable은 순차적으로 접근할 수 있는 요소의 컬렉션이다.
다트에서 Iterable은 추상 클래스이므로 직접 인스턴스화할 수 없다. 하지만 리스트와 셋을 생성하여 새로운 Iterable을 만들 수 있다. 리스트와 셋은 모두 Iterable이므로, Iterable 클래스와 동일한 메서드와 속성을 가진다.
맵은 해시 테이블을 사용하여 키를 통해 요소를 얻는다. 맵의 요소는 entries 또는 values 속성을 사용하여 Iterable 객체로도 읽을 수 있다.
Iterable의 편리 기능
Iterable은 요소와 관련된 편리 기능을 제공한다. 이 기능을 사용하면 쉽게 요소를 확인, 필터링, 맵핑이 가능한다.
확인 기능
- forEach() : 모든 요소를 순차적 접근
- first : 첫 번째 요소 얻기
- last : 마지막 요소 얻기
- firstWhere() : 조건에 만족하는 첫 번재 요소 찾기
- singleWhere() : 조건에 만족하는 하나의 요소 찾기, 하나가 아닌 경우 StateError 발생
- every() : 모든 요소가 특정 조건에 만족하는지 확인
- any() : 하나 이상의 요소가 특정 조건에 만족하는지 확인
필터링
- where() : 특정 조건을 만족하는 모든 요소 찾기
- takeWhere() : 조건이 만족하지 않는 요소가 나타날 때까지 모든 요소를 얻기
- skipWhere() : 조건이 만족하지 않는 요소가 나타날 때까지의 모든 요소를 제거
맵핑
- map() : 각 요소에 함수를 적용하기
모든 요소 순차적 접근 - forEach()
Iterable 요소는 for-in 루프를 사용하여 순차적으로 읽을 수 있다.
const iterable = ['Salad', 'Popcorn', 'Toast'];
for (final element in iterable) {
print(element);
}
하지만 forEach()를 사용하면 더 같단하게 해결할 수 있다.
iterable.forEach(print);
처음과 마지막 요소 읽기 - first, last
Iterable의 처음 요소는 first로 마지막 요소를 last로 가져올 수 있다.
const iterable = ['Salad', 'Popcorn', 'Toast'];
print(iterable.first); // Salad
print(iterable.last); // Toast
last로 마지막 요소를 가져오기 위해서는 모든 요소를 순차적으로 탐색해야 하므로 느릴 수 있다. 비어있는 Iterable에서 first와 last를 사용하면 StateError가 발생한다.
조건에 만족하는 첫 번째 요소 찾기 - firstWhere()
firstWhere()을 사용해서 조건에 만족하는 첫 번째 요소를 찾을 수 있다. 조건을 만족하면 true를 반환하는 함수를 firstWhere() 메서드에 전달하면 된다.
다음 코드는 요소의 길이가 5보다 큰 경우인 첫 번째 요소를 찾는 코드가 된다.
String element = iterable.firstWhere((element) => element.length > 5);
만약, 조건에 만족하는 요소가 없다면 StateError가 발생한다. 에러가 발생하지 않게 하려면 orElse 매개변수에 조건에 만족하는 요소가 없을 때 대체할 값을 제공하면 된다.
다음은 다양한 방법으로 firstWhere() 메서드를 사용하는 예제 코드이다.
bool predicate(String item) {
return item.length > 5;
}
void main() {
const items = ['Salad', 'Popcorn', 'Toast', 'Lasagne'];
var foundItem1 = items.firstWhere((item) => item.length > 5);
var foundItem2 = items.firstWhere((item) {
return item.length > 5;
});
var foundItem3 = items.firstWhere(predicate);
var foundItem4 = items.firstWhere(
(item) => item.length > 10,
orElse: () => 'None!',
);
}
만족하는 요소가 하나인 요소 찾기 - singleWhere()
singleWhere() 메서드는 조건이 만족하는 요소를 찾아주는 메서드이다. firstWhere과 다르게 조건에 만족하는 요소가 하나도 없거나 두 개 이상인 경우 StateError가 발생한다. 즉, singleWhere()는 조건이 만족하는 요소가 하나인 것을 찾아 준다.
다음은 요소에 문자 'a'가 포함되어 있고, 문자 'M'으로 시작하는 요소가 하나 인지 확인하는 함수가 된다. 문자열의 startsWith() 메서드로 문자열로 시작하는지 확인하고, contains() 메서드로 문자열이 포함되어 있는지 확인한다.
String singleWhere(Iterable<String> items) {
return items.singleWhere(
(element) => element.startsWith('M') && element.contains('a'));
}
모든 요소가 특정 조건에 만족하는지 확인하기 - every()
모든 요소가 특정 조건을 만족하는지 확인하기 위해 for-in 루프를 사용할 수 있다.
for (final item in items) {
if (item.length < 5) {
return false;
}
}
return true;
하지만, every() 메서드를 사용하면 더 쉽게 같은 결과를 얻을 수 있다. 모든 요소가 조건을 만족하면 true가 되고, 하나라도 만족하지 않으면 false가 된다.
return items.every((item) => item.length >= 5);
하나 이상의 요소가 특정 조건에 만족하지 확인하기 - any()
any() 메서드는 적어도 하나의 요소가 조건을 만족하는지 확인할 수 있다. 만족하는 요소가 하나라도 있으면 true가 되고, 하나도 없으면 false가 된다.
다음은 문자 'Z'가 포함되어 있는 요소가 하나라도 있는지 확인하는 코드이다.
if (items.any((item) => item.contains('Z'))) {
print('At least one item contains "Z"');
} else {
print('No item contains "Z"');
}
특정 조건을 만족하는 모든 요소를 찾기 - where()
where() 메서드는 조건에 만족하는 요소를 Iterable로 반환하는 메서드이다. 만족하는 요소가 없다면 빈 Iterable이 된다.
다음은 짝수인 요소를 찾는 예제 코드가 된다.
var items = [1, -2, 3, 42];
var evenNumbers = items.where((number) => number.isEven);
조건이 만족하지 않는 요소가 나타날 때까지의 모든 요소를 얻기 - takeWhere()
takeWhere() 메서드는 조건이 만족하지 않는 요소가 나타날 때까지의 모든 요소를 얻을 수 있다.
예를 들어, [1, 3, -2, 0, 4, 5]에서 takeWhere()에 0이 아닌 경우를 전달하게 되면 0이 나타날 때 까진 인 [1, 3, -2]가 반환된다. 즉, 요소를 순차적으로 확인하여 조건이 참인 요소를 반환하고, 거짓이 되는 순간 중단이 된다.
void main() {
const numbers = [1, 3, -2, 0, 4, 5];
var numbersUntilZero = numbers.takeWhile((number) => number != 0);
print('Numbers until 0: $numbersUntilZero'); // 1, 3, -2
}
조건이 만족하지 않는 요소가 나타날 때까지의 모든 요소를 제거하기 - skipWhere()
skipWhere()은 조건이 만족이 만족하지 않는 요소가 나타날 때까지의 요소를 제거한다.
예를 들어, [1, 3, -2, 0, 4, 5]에서 skipWhere()에 0이 아닌 경우를 전달하면 0이 나타날 때까지인 [1, 3, -2]는 제거되고, [0, 4, 5]가 반환된다. 즉, 요소를 순차적으로 확인하여 조건이 거짓이 되는 요소부터 반환한다.
void main() {
const numbers = [1, 3, -2, 0, 4, 5];
var numbersStartingAtZero = numbers.skipWhile((number) => number != 0);
print('Numbers starting at 0: $numbersStartingAtZero');
}
각 요소에 함수를 적용하기 - map()
map() 메서드를 사용해면 각 요소에 함수를 적용하여 새로운 Iterable 객체를 얻을 수 있다.
다음은 numbers의 각 요소에 10을 곱한 결과가 된다.
Iterable<int> output = numbers.map((number) => number * 10);
map()을 이용하면 다른 타입으로 변환할 수도 있다. 다음은 int를 String으로 변환하는 코드가 된다.
Iterable<String> output = numbers.map((number) => number.toString());
'다트 공식 문서 번역 > 기타 문서 번역' 카테고리의 다른 글
다트] 셋(Set) 클래스 (0) | 2024.08.17 |
---|---|
다트] 리스트 클래스 _ 생성자, 속성, 메서드 (0) | 2024.08.17 |