다트는 객체지향 프로그래밍과 함수형 프로그래밍 특징을 모두 제공한다. 함수형 프로그래밍은 자료 처리를 수학적 함수의 계산으로 취급하는 프로그래밍 패러다임이다.
다트에서는 함수를 값으로 취급할 수 있다. 그러므로 변수에 함수를 대입할 수 있다.
void greeting(String text) {
print(text);
}
void main() {
var f = greeting; // 함수를 다른 변수에 대입할 수 있음
f('hello');
}
다른 함수의 매개변수로 함수 자체를 전달하거나 반환받을 수도 있다.
void something(Function(int i) f) {
f(10);
}
void main() {
something((value) {
print(value);
});
}
위 for문은 아래 forEach로 동일하게 작성할 수 있다.
final items = [1, 2, 3, 4, 5];
for (var i = 0; i < items.length; i++) {
print(items[i]); // 1, 2, 3, 4, 5
}
세 가지 방법 모두 동일한 결과 나타낸다.
items.forEach(print); // 1, 2, 3, 4, 5
items.forEach((e) {
print(e);
});
items.forEach((e) => print(e));
두 가지 방법 모두 동일한 결과를 나타낸다.
final items = [1, 2, 3, 4, 5];
for (var i = 0; i < items.length; i++) {
if (items[i] % 2 == 0) {
print(items[i]); // 2, 4
}
}
items.where((e) => e % 2 == 0).forEach(print); // 2, 4
두 가지 방법 모두 동일한 결과를 나타낸다.
final items = [1, 2, 3, 4, 5];
for (var i = 0; i < items.length; i++) {
if (items[i] % 2 == 0) {
print('숫자 ${items[i]}'); // 숫자 2, 숫자 4
}
}
items.where((e) => e % 2 == 0).map((e) => '숫자 $e').forEach(print);
다트에서 함수형 프로그래밍을 지원하는 함수 대부분은 Iterable<T>
라는 타입을 반환한다. 실제로 활용시에는 List형태로 변환하여 사용하는 일이 많다.
final result = [];
items.forEach((e) {
if (e % 2 == 0) {
result.add(e);
}
});
final result = items.where((e) => e % 2 == 0).toList();
자료구조 Set으로 변환하는 함수. 중복을 허용하지 않기 때문에 간단히 중복데이터를 제거할 수 있다.
final items = [1, 2, 2, 3, 3, 4, 5];
var result = [];
var temp = <int>{};
for (var i = 0; i < items.length; i++) {
if (items[i] % 2 == 0) {
temp.add(items[i]);
}
}
result = temp.toSet();
print(result); // 2, 4
final result = items.where((e) => e % 2 == 0).toSet().toList(); // 2, 4
특정 조건을 충족하는 요소가 있는지를 검사할 때 사용한다.
final items = [1, 2, 2, 3, 3, 4, 5];
var result = false;
for (var i = 0; i < items.length; i++) {
if (items[i] % 2 == 0) {
result = true;
break;
}
}
print(result); // true
print(items.any((e) => e % 2 == 0)); // true
반복 요소를 줄여가면서 결과를 만들 때 사용하는 함수이다.
import 'dart:math';
final items = [1, 2, 3, 4, 5];
var maxResult = items[0];
for (var i = 1; i < items.length; i++) {
maxResult = max(items[i], maxResult);
}
print(maxResult); // 5
final items = [1, 2, 3, 4, 5];
print(items.reduce((e, v) => max(e, v))); // 5
final result = items.reduce(max); // 5