Dart cascading operator, functional programming
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 해주는 게 좋음