[Dart] where절과 reduce, fold

728x90

1. where

void main() {
 List<Map<String, String>> people =[
   {
     'name' : '로제',
     'group' : '블랙핑크',
   },
    {
     'name' : '지수',
     'group' : '블랙핑크',
   },  
   {
     'name' : 'RM',
     'group' : 'BTS',
   },   
 ];
  
  print(people);
  //where를 넣으면 T/F 값을 리턴한다.
  final balckPink = people.where((x)=> x['group'] == '블랙핑크');
  
  print(balckPink);
}

 

 

 

2. reduce

prev에는 이전 함수의 리턴 값이 들어가고

next는 다음 인덱스 값이 들어간다.

void main() {
 List<int> numbers = [
   1,
   3,
   5,
   7,
   9,
 ];
  
  final result = numbers.reduce((prev, next){
    print("============");
    
    print('previous: $prev');
    print('next: $next');  
    print('total: ${prev+next}');
    
    return prev + next;
    
  });
  
  print("============");
  print('result :: $result');
}

 

reduce로 글자 더하기

void main() {
  
  List<String> words = [
    '하이',
    'Dart언어',
    '신기해요',
  ];
  
  final sentence = words.reduce((prev, next) => prev + next);
  
  print(sentence);
}

 

태초의 타입과 리턴 타입이 같아야한다.

 

3. fold

fold는 타입이 같지 않아도 된다.

void main(List<String> arguments) {
  List<int> numbers = [1, 3, 5, 6, 9];
  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 cnt = words.fold<int>(0, (prev, next) => prev + next.length);
  print('Count :: $cnt');

 

 

4.casecading operator

  //여러개의 List 합치기
  List<int> even = [4, 6, 8, ];
  List<int> odd = [1, 3, 5, 7, ];

  //casecading operator :: 리스트 안에 값을 풀어넣는 역할

  print([even, odd]); //리스트 안에 리스트가 나옴 [[2,4,6,8],[1,3,5,7]]
  print([...even, ...odd]) // 풀어서 완전히 새로운 리스트로 나옴 [2,4,6,8,1,3,5,7]

  //새로운 List임을 증명하는법 
  print(print == [...even]); //false

 

5. map을 클래스에 넣어주기

void main() {
  List<Map<String, String>> people = [
    {
      'name': '로제',
      'group': '블랙핑크',
    },
    {
      'name': '지수',
      'group': '블랙핑크',
    },
    {
      'name': 'RM',
      'group': 'BTS',
    },
  ];

  print(people);

  final parsedPeople = people
      .map(
        (x) => Person(
          name: x['name']!,
          group: x['group']!,
        ),
      )
      .toList();
  print(parsedPeople);
}

class Person {
  final String name;
  final String group;

  Person({
    required this.name,
    required this.group,
  });
}

 

Instance of 'Person' 이라고 뜨는 것을 바꿔주려면 아래와같이 오버라이드로 바꿔 줄 수 있다

class Person {
  ...
  @override
  String toString(){
    return 'Person(name:$name, group:$group)';
  }
}

 

더 간단하게 코드를 작성하는 경우 아래와 같이 하면 된다.

  final result = people.map(
    (x) => Person(
      name: x['name']!,
      group: x['group']!,
    ),
  ).where((x) => x.group == 'BTS');

  print(result);

728x90

'Flutter' 카테고리의 다른 글

[Dart] Stream  (0) 2024.07.26
[Dart] Async Programming 비동기 프로그래밍  (0) 2024.07.25
[Dart] mapping  (0) 2024.07.17
[Dart] List를 Map 혹은 Set으로 변환하기  (0) 2024.07.17
[Dart] function  (0) 2024.06.12