Flutter/Dart 문법

[Dart] List - reduce / List - fold

Chafle 2023. 3. 23. 18:35
반응형

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이 가능하다.

반응형