Dart #3 함수형 프로그래밍 (Functional Programming)

최민경·2023년 3월 17일

Flutter

목록 보기
3/5

함수형 프로그래밍의 기본은 형변환이다

1. List/Map/Set간 호환

.asMap()
.toSet()
Set.from(List) : 리스트로부터 Set를 만들기
.toList()

2. Mapping

List.map();

  • .map() - mapping
  • List내 기본 메소드
  • 함수 안에 함수를 넣고, 함수파라미터를 넣음
  • mapping한 결과값을 새로운 변수에 지정해서 저장해줘야 함

Map.map();

  • map을 map으로 변경하는 경우:
    - Map을 mapping할 때는 함수 파라미터를 key와 value를 가져옴
    - MapEntry()를 사용해서 'key: value' 형태로 출력
  • map의 key값을 변경하는 경우
  • map의 value값을 변경하는 경우

Set.map();

  • List.map(); 형식과 비슷함

.where();

  • .where()는 true/false를 반환함
  • 필터처럼 true인 파라미터는 유지되고, false인 파라미터는 삭제됨

3. .reduce();


  • String도 가능: 예, 단어 연결을 통해 문장 생성 등
  • 문장 생성 시, 띄어쓰기 주의!

  • reduce()를 사용할 때는 꼭! 같은 타입으로 return해줘야 에러가 안남

4. .fold();

  • reduce 같은 타입 반환해야하는 단점을 보완, 아무 자료형을 반환할 수 있음
  • 2개의 파라미터를 받음
  • return값의 타입을 generic으로 지정해줘야 함

  • 첫 번째 파라미터가 시작값을 뜻함-> 0부터 시작
  • reduce와 달리, 처음 loop을 돌 때,
  • 첫 번째 파라미터가 prev에 들어가고, 첫 번째 원소가 next에 들어감
  • 그 다음은 reduce와 같게 진행됨

5. cascading operator ...

6. 종합

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

  print(people);

  // class 형태로 만들기
  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');
  print(bts);


// chaining , 중간 매개변수를 생략해 코드가 간결해짐
// 다만, 나중에 다른 사람들과 협업 혹은 기억이 안날 때를 대비해 코멘트가 필요함
  final result = people
      .map((x) => Person(name: x['name']!, group: x['group']!))
      .where((x) => x.group == 'BTS')
      .fold<int>(0, (prev, next) => prev + next.name.length);
  print(bts);
}

// class는 데이터 구조가 형식화/명식화되어 있기 때문에,
// class를 통해서 instance를 생성하는 게 구조화되어 있음(데이터 형식, 오타 방지 등)
class Person {
  final String name;
  final String group;

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

  @override
  // Class 출력형태 바꾸기
  String toString() {
    return 'Person(name: $name, group: $group)';
  }
}
  • 결과
[{name: 지수, group: 블랙핑크}, {name: 로제, group: 블랙핑크}, {name: RM, group: BTS}, {name: 뷔, group: BTS}]
[Person(name: 지수, group: 블랙핑크), Person(name: 로제, group: 블랙핑크), Person(name: RM, group: BTS), Person(name: 뷔, group: BTS)]
지수
블랙핑크
로제
블랙핑크
RM
BTS
뷔
BTS
(Person(name: RM, group: BTS), Person(name: 뷔, group: BTS))
(Person(name: RM, group: BTS), Person(name: 뷔, group: BTS))

0개의 댓글