Dart 문법

Dart 문법(4)

hamiric 2024. 10. 28. 14:53

## 해당 글은 강의를 들으면서 알고있던것을 적는게 아닌, 모르고 있던것을 알았을때 적어 놓은것임

 

고차 함수 (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