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으로 바꿔줌으로써 그걸 가지고 여러가지 필터를 사용할 수 있다는 것.