함수형 프로그래밍

테디준·2022년 7월 21일
0

1. forEach()

배열요소를 반복할 때 쓰는 함수다.
final items = [1,2,3,4,5];
for(var i = 0; i < items.length; i++) {
print(items[i]); // 1,2,3,4,5
}
위의 코드를 간단하게 아래처럼 한 줄로 표현할 수 있다. 셋 다 표현방식이 다를 뿐 결과는 같다.
1. items.forEach(print);
2. items.forEach((e) => print(e));
3. items.forEach((e) {print(e);});
😨 결과가 같다고 했는데, 연습문제를 풀다 결과가 다른 게 나오는 걸 만났다.
(transactions.where((e) => e.trader.city == "Cambridge").toList())
.forEach((e) {print(e.trader.name);});
이 경우에 forEach((e) {print(e.trader.name);})부분을 forEach(print);로 바꾸면 Instance of 'Transaction'이라고 나온다. 제대로 작동하면 Brian, Raoul, Alan이 나온다. 😱 왜 일까?
=> 앞의 함수로 추출한 데이터는 city인데, 뒤에 출력하는 것은 city가 아닌 trader.name이기 때문에 forEach((e) {print(e.trader.name);})로 써줘야 제대로 된 값을 출력한다. 해결!!!

2. where()

조건에 따라 정보를 걸러주는 역할을 한다. 특히 if문과 for문을 동시에 쓰고 싶을 때 사용하는 함수다.
final items = [1,2,3,4,5];
for(var i = 0; i < items.length; i++) {
if (items[i].isEven) {
print(items[i]);
  }
}

Dart 언어는 짝수인지 홀수인지에 대해 다른 언어와 달리 isEven, isOdd가 있다.

위 코드를 아래처럼 간단히 바꿀 수 있다.
items.where((e) => e.isEven).forEach(print);

3. map()

원래 있는 리스트를 기반으로 일정 값을 추출하여 새로운 리스트를 만들어주는 함수다.
class Trader {
 String name;
 String city;

 Trader(this.name, this.city);
}

class Transaction {
 Trader trader;
 int year;
 int value;

 Transaction(this.trader, this.year, this.value);
}

final transactions = [
 Transaction(Trader("Brian", "Cambridge"), 2011, 300),
 Transaction(Trader("Raoul", "Cambridge"), 2012, 1000),
 Transaction(Trader("Raoul", "Cambridge"), 2011, 400),
 Transaction(Trader("Mario", "Milan"), 2012, 710),
 Transaction(Trader("Mario", "Milan"), 2012, 700),
 Transaction(Trader("Alan", "Cambridge"), 2012, 950),
];
만약 위의 리스트에서 거래자가 근무하는 도시만 뽑아서 프린트하고 싶다면 어떻게 해야 할까? 바로 이때 map()이 쓰인다.
transactions.map((e) => e.trader.city)).forEach(print); 

4. toSet()

중복되는 데이터를 제거해주는 함수다. 이름이나 주소가 중복될 때 유용하게 쓰인다. 위의 리스트에서 Raoul과 Mario가 두 번씩 나온다. 모든 이름이 한번씩만 나오게 하고 싶을 때 아래와 같이 사용한다.
transactions.map((e) => e.trader.name).toSet().forEach(print);

5. reduce()

전체 값을 비교하여 최종적으로 최고값(max)과 최저값(min)을 구하는 함수다. 단, 리턴 타입(앞의 a와 b)과 리스트 타입(max뒤의 a와 b)이 같아야 사용할 수 있다.
1. print(items.reduce((a,b) => max(a,b)));
2. final result = items.reduce(max);

전체 트랜잭션 중 최대값을 구하는 문제에서 (transactions.reduce((a,b) => max(a.value, b.value));로 했더니 에러가 남. 그 이유는 transactions 안에는 string인 name, city도 있고 int인 year, value도 있어서, max뒤의 value의 int 타입과 같지 않아서였다. 그래서 map으로 value만을 뽑아 리스트를 만든 뒤 비교해 최대값을 구했다.

print(transactions.map((e) => e.value).reduce(max));

6. toList()

어디에든 붙이면 리스트를 만들어주는 함수다. 원하는 데이터만 가져와 새로 리스트를 만드는 일이 많아 자주 쓰인다.

7. sort()

보통 List함수에 있는 여러 인자들을 오름차순이나 내림차순으로 정렬하는데 쓰인다. 기본적으로 숫자는 1,2,3,4 이런 식으로 작은 것에서 큰 순으로 정렬하고, 알파벳을 a,b,c순으로 정렬한다. ✋ 여기서 잠깐! ..sort()로 꼭 스프레드 형식으로 사용한다.
모든 거래자의 이름을 알파벳순으로 정렬하여 나열한다면, 아래와 같이 쓴다.
(transactions.map((e) => e.trader.name).toSet().toList()..sort()).forEach(print);

0개의 댓글