반응형
아주 기본적인 리스트 개념은 생략하고, 다트에서 제공하는 리스트의 다양한 기능을 알아보자.
spread operator
var b = [4, 5];
var a = [1, 2, 3, ...b]; // a = [1,2,3,4,5]가 됨
assert(a[3] == 4);
assert(a[4] == 5);
null-aware spread operator
아래 코드에서 변수 list가 null이면 아무것도 추가되지 않는다.
var list2 = [0, ...?list];
assert(list2.length == 1);
collection if
리스트 안에서 if를 사용할 수 있다.
var flag = true;
var a = [1, 2, if(flag) 3];
print(a); //[1, 2, 3]
collection for
var nums = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
var even_square = [for(var i in nums) if(i%2==0) i*i];
print(even_square); //[4, 16, 36, 64, 100]
reduce
map, filter는 많이 사용을 해봤지만 reduce는 새롭게 알게 되어 정리한다. reduce는 익명함수의 리턴 값을 그 다음 함수 실행할 때 첫번째 인자로 넘겨준다.
그렇기 때문에 이 함수가 정상 작동하려면, lst 각 인자의 타입과 result 타입이 일치해야 한다.
var lst = ['a', 'b', 'c', 'd', 'e'];
var result = lst.reduce((v1, v2) => v1 + v2);
assert(result == 'abcde');
fold
reduce와 비슷하지만, reduce처럼 타입을 맞추지 않아도 된다.
fold 함수에는 첫번째 인자를 지정해줄 수 있는데 첫 함수를 실행할 때 이 값이 첫번재 인자로 들어가고 리스트의 첫번째 인자가 두번째 인자로 들어간다.
반환타입을 명시하기 위해 fold에 제네릭으로 타입을 명시하면 된다.
var lst = ['1', '2', '3', '4', '5'];
var result = lst.fold<int>(0, (v1, v2) => v1 + int.parse(v2));
assert(result == 15);
다트 언어 공식문서 : https://dart.dev/guides/language/language-tour
댓글