일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |
- Swift
- rxswift
- Apple
- IOS
- Archive
- Code
- UIButton
- 웹뷰
- error
- darkmode
- FLUTTER
- Xcode
- Firebase
- view
- github
- 이미지
- 한글
- Session
- Notification
- window
- appstore
- 개발자
- iOS16
- Git
- Realm
- geofencing
- JPA
- MacOS
- mac
- SwiftUI
- Today
- Total
EEYatHo 앱 깎는 이야기
Dart ) 고차함수 - EEYatHo Flutter 본문
고차함수 ( Higher-order function )
함수를 파라미터로 받거나, 함수를 리턴하는 함수
Dart에서 제공하는 고차함수를 셀수도 없이 많다.
자주 사용하는 순으로 정리한다.
- map ( + mapIndexed )
- where
- reduce
- fold
- 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