Functional Programming

이건 어렵지 않아요~

기본은 형변환


void main(){
  List<String> blackPink = ['로제', '지수', '리사', '제니'];

  print(blackPink); 
  print(blackPink.asMap()); // map으로 변경할 수 있음
  print(blackPink.toSet()); // Set으로 변경할 수 있음 중복 제거도 해줌.

  Map blackPinkMap = blackPink.asMap();

  print(blackPinkMap.keys.toList());
  print(blackPinkMap.values.toList());

  Set blackPinkSet = blackPink.toSet();

  print(blackPinkSet.toList());

}

여러가지 방법으로 형변환을 할 수 있다.

void main(){
  List<String> blackPink = ['로제', '지수', '리사', '제니'];

  final newBlackPink = blackPink.map((x){
    return '블랙핑크 $x'; // 이름 앞에 블랙핑크를 가진 이름으로 바뀜
  })

  print(blackPink); // 맵이라는 함수가 그대로 있음.
  print(newBlackPink.toList); // 앞에 블랙핑크가 붙음

  final newBlackPink2 = blackPink.map(x=> '블랙핑크 $x');  // arrow func로 만든 경우

  print(newBlackPink2.toList); // 앞에 블랙핑크가 붙음

  print(blackPink == newBlackPink); // false
  print(newBlackPink == newBlackPink2); //false

  // map을 쓰면 아예 새로운 리스트를 만들어준다.

  String number = '13579';

  final parsed = number.split('').map(x=>'$x.jpg').toList();

  // 한줄안에 했네요~!!

}

string parse 변환하는 방법

map

void main(){
  Map<String, String> harryPotter = {
    'Harry Potter' : '해리 포터',
    'Ron Weasley' : '론 위즐리',
    'Hermione Granger' : '헤르키온느 그레인져',
  };

  final result = harryPotter.map(
    (key, map) => mapEntry(
      'Harry Potter Character $key',
      '해리포터 캐릭터 $value',
    )
  );

  print(harryPotter);
  print(result);

  final keys = harryPotter.keys.map((x) ->)
}
void main(){
  Set blackPinkSet = {
    '로제',
    '지수',
    '제니',
    '리사'
  };

  final newSet = blackPinkSet.map((x) => '블랙핑크 $x').toSet();

  print(newSet);
}

where

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

  print(people);
  // 이렇게하면 블랙핑크만 남기고 나머지는 다 지울 수 있다.
  final blackpink = people.where((x) => x['group'] == '블랙핑크');
  print(blackPink);

}

where의 사용법임,

일종의 필터링을 할 수 있다.

reduce

reduce는 js와 동일 reduce를 실행하는 멤버들의 타입과 같은 리턴타입을 사용해야 한다.

fold

void main(){
  List<int> numbers = [1,3,5,7,9];

  final sum = numbers.fold<int>(0, (prev, next) => prev + next);

  print(sum);
}

reduce랑 동일한데 유일한 차이는 첫번째 값을 지정해줄 수 있다. 위에선 0

이러면 어떤 장점을 가지고 있냐 아무 형태로나 리턴해줄 수 있다.

final count = words.fold<int>(0, (prev, next)=>prev.length+next.length);

print(count);

이렇게 형을 지정해줄 수 있음!!

Cascading Operator

void main(){
  List<int> even  =[2,4,6,8,10];
  List<int> odd  =[1,3,5,7,9];

  // Cascading Operator
  print([...even, ...odd]);
}
``

배열 두개를 합칠  있음~!

완전히 새로운 리스트로 생성되는 것임.


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

  print(people);

  final parsedPeople = people.map(
    (x) => Person(
      name: x['name']!, // 무조건 존재해!
      group: x['group']!, // 무조건 존재해!
    )
  ).toList();

  print(parsedPeople);

  for(Person person in parsedPeople){
    print(person.name);
    print(person.group);
  }

  final bts = parsedPeople.where(
    (x) => x.group == 'BTS',
  );
  // 결국에는 Instance를 String으로 바꿔줌으로써 그걸 가지고 여러가지 필터를 사용할 수 있다는 것.

}

class Person{
  final String name;
  final String group;

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

  @override
  String toString(){ // print 했을 때 의 값을 변경할 수 있음
    return 'Person(name:$name, group:$group)';
  }
}

결국에는 Instance를 String으로 바꿔줌으로써 그걸 가지고 여러가지 필터를 사용할 수 있다는 것.