[Dart] Iterable Collections

CheolHyeon Park·2021년 8월 1일
0

flutter

목록 보기
5/5

Iterable collections

Collection??

컬렉션은 객체들의 그룹을 나타내는 객체이다.

일반적인 collection 타입은 List, Set, Map이다.

  • List: 인덱스로 요소를 읽는 컬렉션
  • Set: 유니크한 요소를 갖는 컬렉션
  • Map: 키를 사용해서 요소를 읽는 컬렉션

Iterable??

순차적으로 접근할 수 있는 요소의 컬렉션

다트에서는 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가 나온다.

firstWhere

조건에 맞는 첫번째 값 찾기.

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

  • Iterable은 요소에 순차적으로 접근한다.
  • Iterable에 모든 요소에 접근하는 가장 쉬운 방법은 for-in 구문을 이용하는 것이다.
  • 첫번째, 마지막 요소에 접근하는 프로퍼티 first, last
  • 조건을 만족하는 요소 찾기 : firstWhere()

SingleWhere()

요소 하나를 찾는다. firstWhere()와 비슷하지만 한개 이상 혹은 아예 요소가 없으면 StateError를 던진다.

SingleWhere()는 모든 iterable의 데이터에 접근한다. 그러므로, 무한대의 iterable 혹은 매우 큰 요소에 대해서는 문제가 생길 수 있다.

Checking conditions

Iterable의 모든 요소에 대한 valdation은 every()를 이용한다.

Using any() and every()

  • any(): 최소한 한개가 조건을 만족하면 true
  • every(): 모든 요소가 조건을 만족하면 true

Filtering

조건을 만족하는 모든 요소들을 찾기 위해서 where()를 사용하라

var evenNumbers = numbers.where((number) => number.isEven);

where는 값을 찾지 못해도 StateError를 throw하지 않는다.

takeWhile()과 skipWhile()

  • takeWhile() : 조건을 만족하는 어떤 값을 찾기 전까지 모든 요소를 포함한 Iterable을 반환한다.
  • skipWhile() : 조건을 만족하지 않는 첫번째 값을 포함한 그 후 모든 요소를 Iterable로 반환한다.

Mapping

Iterable의 모든 요소에 대해 어떤 함수를 적용하여 새로운 것으로 대체한다.

Iterable<int> output = numbers.map((number) => number * 10);

map() 함수는 lazy 이터러블이다. 그래서 제공된 함수는 iterated될 때, 호출된다.

공식문서

profile
나무아래에 앉아, 코딩하는 개발자가 되고 싶은 박철현 블로그입니다.

0개의 댓글