## 해당 글은 강의를 들으면서 알고있던것을 적는게 아닌, 모르고 있던것을 알았을때 적어 놓은것임
고차 함수 (Higher-order Function)
함수를 다루는 함수, 컬렉션 타입의 데이터에 있는 요소를 처리하거나 변환할때 주로 사용된다.
- map
// 원본 데이터를 '직접 가공하지 않고', 특정 함수를 적용한 새로운 데이터를 반환한다.
// '매개변수'는 컬렉션 내부 요소값을 의미한다!!
// map(([매개변수]) { return [매개변수에 적용할 동작] });
List<String> fruitList = ['사과', '오렌지', '수박'];
var delicious = fruitList.map((fruit) {
return '맛있는 $fruit';
});
print(delicious); // (맛있는 사과, 맛있는 오렌지, 맛있는 수박)
// 매개변수에 적용할 동작이 간단할 경우(한줄로 표현할 수 있는경우) 사용할 수 있는 방법
// map(([매개변수]) => [매개변수에 적용할 동작] );
List<int> numbers = [1, 2, 3, 4, 5];
var doubledNumbers = numbers.map((n) => n * 2);
print(doubledNumbers); // (2, 4, 6, 8, 10)
- where / firstWhere / lastWhere
// 컬렉션 타입의 데이터에 있는 각 요소들을 특정 조건에 넣었을때 참인 요소들만 필터링한 새로운 컬랙션 타입의 데이터를 반환
// where(([매개변수]) { return [조건식] });
List<int> numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
var result = numbers.where((number) {
return number > 5;
});
print(result); // (6, 7, 8, 9, 10)
// firstWhere(([매개변수]) { return [조건식] });
List<String> fruits = ['사과', '오렌지', '수박'];
var result = fruits.firstWhere((fruit) {
return fruit.length == 2;
});
print(result); // 사과
// lastWhere(([매개변수]) { return [조건식] });
List<int> numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
var result = numbers.lastWhere((number) {
return number > 5;
});
print(result); // 10
// 매개변수에 적용할 동작이 간단할 경우(한줄로 표현할 수 있는경우) 사용할 수 있는 방법
// where(([매개변수]) => [조건식] );
List<String> fruits = ['사과', '오렌지', '수박'];
var result = fruits.where((f) => f.length == 2);
print(result); // (사과, 수박)
// firstWhere(([매개변수]) => [조건식] );
List<int> numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
var result = numbers.firstWhere((n) => n > 5);
print(result); // 6
// lastWhere(([매개변수]) => [조건식] );
List<String> fruits = ['사과', '오렌지', '수박'];
var result = fruits.firstWhere((f) => f.length == 2);
print(result); // 사과
- reduce
// 컬랙션 타입의 데이터에 있는 요소들을 하나의 값을 결합하는 함수
// 매개변수1은 이전 실행에서 반환된 값을 뜻하고, 매개변수2는 컬랙션 타입의 데이터 요소를 뜻한다.
// reduce(([매개변수1], [매개변수2]) { return [적용할 동작] });
List<int> numbers = [1, 2, 3, 4];
var result = numbers.reduce((a, b) {
return a * b;
});
// reduce(([매개변수1], [매개변수2]) => [적용할 동작] );
List<int> numbers = [1, 2, 3, 4];
var result = numbers.reduce((a, b) => a * b);
- fold
// 컬랙션 타입의 데이터에 있는 요소들을 하나의 값을 결합하는 함수
// 매개변수1은 이전 실행에서 반환된 값(처음이면 초기값)을 뜻하고, 매개변수2는 컬랙션 타입의 데이터 요소를 뜻한다.
// fold(초기값, ([매개변수1], [매개변수2]) { return [적용할 동작] });
List<String> words = ['다트는 ', '참 ', '재미있군 ?'];
var result = words.fold('앗, ', (a, b) {
return a + b; // '앗, 다트는 참 채미있군 ?'
});
// fold(초기값, ([매개변수1], [매개변수2]) => [적용할 동작] );
List<int> numbers = [1, 2, 3, 4];
var result = numbers.fold(1, (a, b) => a * b);
// fold 에서는 초기값과 반환값만 잘 맞춰준다면, 반환값으로 컬랙션과는 다른 타입으로 반환할 수 있다
// 즉, fold 에서는 반환값이 초기값의 타입을 따라간다.
List<int> numbers = [1, 2, 3, 4, 5];
var result = numbers.fold('', (a, b) => '$a' + '$b');
print(result); // 12345
print(result.runtimeType); // String
## reduce() vs fold()
특징 | reduce() | fold() |
초기값의 유무 | Collection 데이터의 첫번째 요소 | 초기값 |
빈 Collection 사용가능 여부 | X | O |
타입 유연성 여부 | X | O (초기값의 타입을 따라감) |
- any
// 컬랙션 타입의 데이터에 있는 요소 중 하나라도 주어진 조건을 만족하면 true를 반환
// any(([매개변수]) { return [조건식] });
List<int> numbers = [1, 2, 3, 4, 5];
var result = numbers.any((number) {
return number > 10;
});
print(result); // false
// any(([매개변수]) => [조건식] );
List<int> numbers = [1, 2, 3, 4, 5];
var result = numbers.any((n) => n.isEven);
print(result); // true
- every
// 컬랙션 타입의 데이터에 있는 모든 요소가 주어진 조건을 만족하면 true를 반환
// every(([매개변수]) { return [조건식] });
List<int> numbers = [1, 2, 3, 4, 5];
var result = numbers.every((number) {
return number > 0;
});
print(result); // true
// every(([매개변수]) => [조건식] );
List<int> numbers = [1, 2, 3, 4, 5];
var result = numbers.every((n) => n.isEven);
print(result); // false
- takeWhile
// 컬랙션 타입의 데이터에 있는 요소들을 주어진 조건에 넣었을때,
// 참이 되는 동안은 해당 요소들을 반환하고, 처음으로 거짓이 되는 순간부터의 요소들은 무시하는 함수
// takeWhile(([매개변수]) { return [조건식] });
List<int> numbers = [1, 2, 3, 4, 5, 6];
var result = numbers.takeWhile((number) {
return number.isOdd;
});
print(result); // (1)
// takeWhile(([매개변수]) => [조건식] );
List<int> numbers = [1, 2, 3, 4, 5, 6];
var result = numbers.takeWhile((number) => number < 4);
print(result); // (1, 2, 3)
- skipWhile
// 컬랙션 타입의 데이터에 있는 요소들을 주어진 조건에 넣었을때,
// 참이 되는 동안은 해당 요소들을 모두 무시하고, 처음으로 거짓이 되는 순간부터의 요소들은 반환하는 함수
// takeWhile(([매개변수]) { return [조건식] });
List<int> numbers = [1, 2, 3, 4, 5, 6];
var result = numbers.skipWhile((number) {
return number < 4;
});
print(result); // (4, 5, 6)
// takeWhile(([매개변수]) => [조건식] );
List<int> numbers = [1, 2, 3, 4, 5, 6];
var result = numbers.takeWhile((number) => number.isOdd);
print(result); // (2, 3, 4, 5, 6)
- expand
// 컬랙션을 컬랙션으로 묶었을때, 내부 값들을 평탄화 시켜주는 함수
// Iterable을 상속받는 List,Set,Map에서 사용 가능
List<List<int>> listOfLists = [[1, 2], [3, 4], [5, 6]];
var flattenedList = listOfLists.expand((list) => list).toList();
print(flattenedList); // [1, 2, 3, 4, 5, 6]
위의 함수들을 메서드 체이닝 방식으로 사용한다면?
아래의 방식으로써 보다 간단하게 함수를 조합할 수 있다!
List<int> numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
var doubledNumbers = numbers.map((number) => number * 2);
var result = doubledNumbers.where((number) => number > 5);
print(result); // (6, 8, 10, 12, 14, 16, 18, 20)
==>
List<int> numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
var result = numbers
.map((number) => number * 2)
.where((number) => number > 5);
print(result); // (6, 8, 10, 12, 14, 16, 18, 20)
'Dart 문법' 카테고리의 다른 글
Dart 문법(6) (0) | 2024.11.04 |
---|---|
Dart 문법(5) (0) | 2024.11.01 |
Dart 문법(3) (0) | 2024.10.28 |
Dart 문법(2) (0) | 2024.10.28 |
Dart 문법 (1) (0) | 2024.10.25 |