Dart - 함수형 프로그래밍2(고차함수)

목진성·2024년 10월 29일

Dart Language

목록 보기
5/12

고차함수란?

함수를 다루는 함수. 고차함수는 Collection 타입의 데이터에 있는 요소를 처리하거나 변환할 때 사용해요. 함수를 다루는 함수라 무슨 말인지 이해가 잘 안되죠? 예시들을 보면서 이해해 봅시다.

고차함수 종류

  1. .map( ) - Collection 타입인 데이터의 각 요소에 특정 함수를 적용한 새로운 Collection 타입의 데이터를 반환
// List(), Set(), Map() 모두 가능
List<int> numbers = [1, 2, 3, 4, 5];
var doubledNumbers = numbers.map((n) {
	return n * 2;
});
print(doubledNumbers); // (2, 4, 6, 8, 10)


List<int> numbers = [1, 2, 3, 4, 5];
var doubledNumbers = numbers.map((n) => n * 2);
print(doubledNumbers); // (2, 4, 6, 8, 10)
  1. where( ) - Collection 타입의 데이터에 있는 각 요소들을 특정 조건에 넣었을 때참인 요소들만 필터링한 새로운 Collection 타입의 데이터를 반환
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)


List<int> numbers = [1, 2, 3, 4, 5, 6];
var result = numbers.where((number) {
	return number.isEven
});
print(result); // (2, 4, 6)

TIP💡 .isEven( )은 짝수면 true, .홀수면 false 반환

  1. firstWhere( ) - Collection 타입의 데이터에 있는 각 요소들을 특정 조건에 넣었을 때 참인 요소들 중 첫번째 요소를 반환
  2. lastWhere( ) - 참인 요소들 중 마지막 요소를 반환
// firstWhere()
List<int> numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
var result = numbers.firstWhere((number) {
	return number > 5;
});
print(result); // 6

// lastWhere()
List<int> numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
var result = numbers.lastWhere((number) {
	return number > 5;
});
print(result); // 10

5. reduce( ) - Collection 타입의 데이터에 있는 요소들을 하나의 값으로 결합

List<int> numbers = [1, 2, 3, 4, 5];
int result = numbers.reduce((a, b) {
  print('a : $a');
  print('b : $b');
  print('a + b : ${a + b}');
  print('----------------------');
  return a + b;
});
print('result : $result');

/*
a : 1
b : 2
a + b : 3
----------------------
a : 3
b : 3
a + b : 6
----------------------
a : 6
b : 4
a + b : 10
----------------------
a : 10
b : 5
a + b : 15
----------------------
result : 15
*/
  1. fold( ) - reduce와 동일하나 첫번째 매개변수를 설정해준 것
List<int> numbers = [1, 2, 3, 4, 5];
int result = numbers.fold(0, (a, b) {
  print('a : $a');
  print('b : $b');
  print('a + b : ${a + b}');
  print('----------------------');
  return a + b;
});
print('result : $result');

/*
a : 0
b : 1
a + b : 1
----------------------
a : 1
b : 2
a + b : 3
----------------------
a : 3
b : 3
a + b : 6
----------------------
a : 6
b : 4
a + b : 10
----------------------
a : 10
b : 5
a + b : 15
----------------------
result : 15
*/
  1. any( ) - Collection 타입의 데이터에 있는 요소 중하나라도 주어진 조건을 만족하면 true 를 반환
  2. every( ) - Collection 타입의 데이터에 있는 모든 요소가 주어진 조건을 만족하면 true 를 반환
//any()
List<int> numbers = [1, 2, 3, 4, 5];
var result = numbers.any((n) => n.isEven);
print(result); // true

// every()
List<int> numbers = [1, 2, 3, 4, 5];
var result = numbers.every((n) => n.isEven);
print(result); // false
  1. takeWhile( ) - Collection 타입의 데이터에 있는 요소들을 주어진 조건에 넣었을 때 참이 되는 동안은 해당 요소들을 반환하고, 조건이 처음으로 거짓이 되는 순간부터의 요소들은 모두 무시
  2. skipWhile( ) - Collection 타입의 데이터에 있는 요소들을 주어진 조건에 넣었을 때 참이 되는 동안은 해당 요소들을 건너뛰고, 조건이 처음으로 거짓이 되는 순간부터의 요소들을 모두 반환
// takeWhile()
List<int> numbers = [1, 2, 3, 4, 5, 6];
var result = numbers.takeWhile((number) => number.isOdd);
print(result); // (1)

// skipWhile()
List<int> numbers = [1, 2, 3, 4, 5, 6];
var result = numbers.takeWhile((number) => number.isOdd);
print(result); // (2, 3, 4, 5, 6)

TIP💡 .isOdd - 홀수면 true, 짝수면 false 반환

profile
우주를 항해하는 여행자

0개의 댓글