[Dart] List - reduce / List - fold
reduce의 특징은 파라미터가 2개가 들어간다.
예시 코드로 형태를 확인해보자(prev와 next 파라미터를 유의해서 보자)
void main() {
List<int> numbers = [
3,
5,
2,
1,
4,
7,
10
];
final result = numbers.reduce((prev, next){
print('-------------');
print('previous : $prev');
print('next : $next');
print('total : ${prev + next}');
return prev + next;
});
print(result);
}
원리를 보면 previous 값과 next 값이 주어진 함수대로 더해져서 total 값으로 리턴해주게 되는데
다음 prev 값을 보면 이전의 total로 리턴받았던 값이 prev로 들어감을 알 수 있다.
결론
이전 함수에서 리턴해준 값이 다시 prev로 들어간다.
String을 reduce로 합쳐볼 수도 있다.
List<String> words = [
'안녕 ',
'나는 말이야 ',
'플러터를 공부 중이야'
];
final sentence = words.reduce((prev, next) => prev + next);
print(sentence);
주의점
리턴타입과 List를 정의한 타입과 동일해야 한다.
예를들어
List<String> words = [
'안녕 ',
'나는 말이야 ',
'플러터를 공부 중이야'
];
final sentence = words.reduce((prev, next) => prev + next);
print(sentence);
words.reduce((prev, next) => prev.length + next.length);
List의 타입은 String인데
reduce를 수행하고 난 후의 return타입이 int이기 때문에 오류가 나게 된다.
fold함수 역시 reduce와 흡사하다
fold함수도 파라미터를 받게 되는데
1. 시작할 값
2. previous 값
3. next 값
reduce와의 차이점은
1. 시작할 값이 [0]의 값이 아니고 유저가 파라미터로 정할 수 있다는 것
2. 리턴 타입을 정해준 다는 것
코드를 보자(초기값, prev와 next 파라미터를 유의해서 보자)
void main() {
List<int> numbers = [
3,
5,
2,
1,
4,
7,
10
];
final sum = numbers.fold<int>(0, (prev, next) {
print('------------------');
print('prev : $prev');
print('next : $next');
print('total : ${prev + next}');
return prev + next;
});
print(sum);
}
numbers.fold<int>(0, (prev, next) {});
fold뒤에 반환타입을 적어주고 (초기값, (prev, next)) 의 형태로 돼있음을 볼 수 있다.
초기값만 정해준 것으로 가고 나머지는 reduce와 동일하다
reduce에서 못했던 List의 타입과 return 타입이 다른 것을 fold에서 타입을 정해줌으로서 가능하게 되는데
코드로 확인해보면
void main() {
List<int> numbers = [
3,
5,
2,
1,
4,
7,
10
];
final sum = numbers.fold<int>(0, (prev, next) => prev + next);
print(sum);
List<String> words = [
'안녕하세요 ',
'저는 말입니다 ',
'플러터를 공부하고 있습니다.'
];
final sentence = words.fold<String>('',(prev, next) => prev + next);
print(sentence);
final count = words.fold<int>(0, (prev, next) => prev + next.length);
print(count);
}
prev의 초기값이 0이기 때문에 next.length 가 int로 붙어서 String의 글자의 길이를 return 하게 된다.
결론
fold는 List의 타입과 return의 타입이 달라도 타입만 정해주면 return이 가능하다.