EEYatHo 앱 깎는 이야기

Dart ) 고차함수 - EEYatHo Flutter 본문

Flutter/Dart

Dart ) 고차함수 - EEYatHo Flutter

EEYatHo 2022. 9. 27. 13:36
반응형

 

고차함수 ( Higher-order function )


함수를 파라미터로 받거나, 함수를 리턴하는 함수

 

Dart에서 제공하는 고차함수를 셀수도 없이 많다.

자주 사용하는 순으로 정리한다.

 

  1. map ( + mapIndexed )
  2. where
  3. reduce
  4. fold
  5. forEach ( + forEachIndexed )



Iterable 이란?

들어가기 전에, Dart의 대부분 컬랙션에 적용하는 고차함수는 Iterable을 반환한다.

 

Iterable은 Dart에서 직렬적으로 원소들을 엑세스 할 수 있는 컬랙션들의 최상위 추상 클래스이다. ( List, Set, Map 등 )  
( 원문 :  A collection of values, or "elements", that can be accessed sequentially. )

 

Iterable을 일반적인 배열(List)로 바꾸기 위해서는 .toList() 함수를 사용하면 된다.

 

 

 

map


Iterable에서 모든 값들에게 같은 연산을 적용한 새로운 Iterable를 만든다.

List<num> numbers = [1, 2, 3, 4];

var multiply10 = numbers.map( (i) => i * 10);
// (10, 20, 30, 40)

var another = numbers.map( (i) {
  return i * 10;
});
// (10, 20, 30, 40)

mapIndexed ( with index )

import 'package:collection/collection.dart';

List<num> numbers = [1, 2, 3, 4];
var result = numbers.mapIndexed( (index, element) {
  if (index < 2) {
  	return element;
  } else {
    return element * 10;
  }
});
// (1, 2, 30, 40)

 

 

where


Iterable에서 특정 조건을 만족하는 값들로 새로운 Iterable를 만든다.

final numbers = <int>[1, 2, 3, 5, 6, 7];

var result = numbers.where((x) => x < 5); 
// (1, 2, 3)

result = numbers.where((x) => x.isEven); 
// (2, 6)

 

 

 

forEach


for문의 고차함수 형태다. 값들을 제공 받은 함수의 파라미터로 순차적으로 연산한다.

final numbers = <int>[1, 2, 6, 7];
numbers.forEach(print);
// 1
// 2
// 6
// 7

 

 

 

reduce


Iterable에 있는 값들을 순차적으로 함수에 적용시켜 하나의 값으로 만든다.

최소 1개의 원소가 있어야 한다. ( 비어있으면 크래쉬 발생 )

첫번째 값을 초기값으로 사용한다.

final numbers = <double>[10, 2, 5, 0.5];

final result = numbers.reduce((value, element) => value + element);
// 17.5

 

 

 

fold


Iterable에 있는 값들을 순차적으로 함수에 적용시켜 하나의 값으로 만든다.

빈 컬렉션에 사용해도 크래쉬가 안난다.

초기값을 매개변수로 받는다. ( 원소의 타입과 반환값의 타입이 다르다면, reduce가 아닌 fold를 사용해야한다. )

final numbers = <double>[10, 2, 5, 0.5];
const initialValue = 100.0;
final result = numbers.fold<double>(initialValue, (previousValue, element) => previousValue + element);
// 117.5

final words = <string>["abc", "apple", "dart", "flutter"];
const initialValue = 0;
final sumWordsLength = words.fold(0, (l, word) => l + word.length);
// 18

 

 

forEach


for문의 고차함수 형태다. 값들을 제공 받은 함수의 파라미터로 순차적으로 연산한다.

final numbers = <int>[1, 2, 6, 7];
numbers.forEach(print);
// 1
// 2
// 6
// 7

forEachIndexed ( with index )

import 'package:collection/collection.dart';

final numbers = <int>[1, 2, 6, 7];
numbers.forEachIndexed((index, element) {
	print(${index}:${element});
}
// 0:1
// 1:2
// 2:6
// 3:7
Comments