CS/Flutter | Dart

Dart cascading operator, functional programming

damzzi 2023. 7. 12. 00:12

cascading operator 

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

사용시 완전히 새로운 List에 값 넣는 것

Dart엔 짱 신기한 연산자가 있군녀,,,,

 

 

map은 자유도가 너무 높음

-> key에 오타가 있거나 등등 해도 강제할 수 없음

 

프론트엔드 작업 시 어떤 데이터를 다루게 되어도 꼭 구조화해서 다루게 됨

class를 미리 정의해두면 이 데이터 타입이 어떻게 되고 구조가 어떻게 되는지에 대해 믿을 수 있는 상태가 됨

void main() {
  List<Map<String, String>> ppl = [
    {
      "name": "로제",
      "group": "블랙핑크",
    },
    {
      "name": "지수",
      "group": "블랙핑크",
    },
    {
      "name": "뷔",
      "group": "bts",
    },
    {
      "name": "제이홉",
      "group": "bts",
    },
  ];
  print(ppl);

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

class Person {
  final String name;
  final String group;

  Person({
    required this.name,
    required this.group,
  });
  
  @override
  // object의 함수 toString 덮어쓰기
  // Instance of 'Person' 이라고 출력되는 것 수정 위함
  String toString(){
    return "Person(name: $name, group: $group)";
  }
}

[{name: 로제, group: 블랙핑크}, {name: 지수, group: 블랙핑크}, {name: 뷔, group: bts}, {name: 제이홉, group: bts}]
[Person(name: 로제, group: 블랙핑크), Person(name: 지수, group: 블랙핑크), Person(name: 뷔, group: bts), Person(name: 제이홉, group: bts)]

 

 

void main() {
  List<Map<String, String>> ppl = [
    {
      "name": "로제",
      "group": "블랙핑크",
    },
    {
      "name": "지수",
      "group": "블랙핑크",
    },
    {
      "name": "뷔",
      "group": "bts",
    },
    {
      "name": "제이홉",
      "group": "bts",
    },
  ];
//   print(ppl);

  final parsedPpl = ppl.map(
    (x) => Person(
      name: x['name']!,
      group: x['group']!,
    ),
  ).toList();
  print(parsedPpl);
  
  for(Person person in parsedPpl){
    print(person.name);
    print(person.group);
  }
}

class Person {
  final String name;
  final String group;

  Person({
    required this.name,
    required this.group,
  });
  
  @override
  // object의 함수 toString 덮어쓰기
  // Instance of 'Person' 이라고 출력되는 것 수정 위함
  String toString(){
    return "Person(name: $name, group: $group)";
  }
}

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

이렇게 접근해 가져올 수도 있음

 

로제
블랙핑크
지수
블랙핑크

bts
제이홉
bts

 

 

void main() {
  List<Map<String, String>> ppl = [
    {
      "name": "로제",
      "group": "블랙핑크",
    },
    {
      "name": "지수",
      "group": "블랙핑크",
    },
    {
      "name": "뷔",
      "group": "bts",
    },
    {
      "name": "제이홉",
      "group": "bts",
    },
  ];
//   print(ppl);

  final parsedPpl = ppl.map(
    (x) => Person(
      name: x['name']!,
      group: x['group']!,
    ),
  ).toList();
  print(parsedPpl);
  
  final pickBts = parsedPpl.where(
  (x) => x.group == 'bts',);
  print(pickBts);
}

class Person {
  final String name;
  final String group;

  Person({
    required this.name,
    required this.group,
  });
  
  @override
  // object의 함수 toString 덮어쓰기
  // Instance of 'Person' 이라고 출력되는 것 수정 위함
  String toString(){
    return "Person(name: $name, group: $group)";
  }
}

  final pickBts = parsedPpl.where(
  (x) => x.group == 'bts',);
  print(pickBts)

 

[Person(name: 로제, group: 블랙핑크), Person(name: 지수, group: 블랙핑크), Person(name: 뷔, group: bts), Person(name: 제이홉, group: bts)]
(Person(name: 뷔, group: bts), Person(name: 제이홉, group: bts))

 

where() 이용해 bts 그룹의 데이터만 가져오기

 

 

void main() {
  List<Map<String, String>> ppl = [
    {
      "name": "로제",
      "group": "블랙핑크",
    },
    {
      "name": "지수",
      "group": "블랙핑크",
    },
    {
      "name": "뷔",
      "group": "bts",
    },
    {
      "name": "제이홉",
      "group": "bts",
    },
  ];
//   print(ppl);

  final parsedPpl = ppl
      .map(
        (x) => Person(
          name: x['name']!,
          group: x['group']!,
        ),
      )
      .toList();
//   print(parsedPpl);

  final pickBts = parsedPpl.where(
    (x) => x.group == 'bts',
  );
  print("pickBts: $pickBts");

  final res = ppl
      .map(
        (x) => Person(
          name: x["name"]!,
          group: x["group"]!,
        ),
      )
      .where((x) => x.group == "bts");
  print("res: $res");
}

class Person {
  final String name;
  final String group;

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

  @override
  // object의 함수 toString 덮어쓰기
  // Instance of 'Person' 이라고 출력되는 것 수정 위함
  String toString() {
    return "Person(name: $name, group: $group)";
  }
}

pickBts: (Person(name: 뷔, group: bts), Person(name: 제이홉, group: bts))
res: (Person(name: 뷔, group: bts), Person(name: 제이홉, group: bts))

 

위 두 결과가 같은 것을 볼 수 있음

 

functional programming의 장점은 이처럼 계속 바꿔가며 진행(chaining)할 수 있다는 점

-> 새로운 형태의 값을 만들어 낼 수 있음

functional programming은 완전히 새로운 List(값)를 생성해 줌

 

코드가 간결해진다는 장점이 있기에 functional programming 하는 건데, 너무 많이 변경해버리면 협업이나 등등에 문제가 될 수 있음

-> 정말 필요한 것만 functional programming 해주는 게 좋음