출처 : 유튜브 코드팩토리 함수형 프로그래밍
형변환, 리스트, Map, Set,Where,Reduce,Fold,Cascading Operator,
## 형변환 - 함수형 프로그래밍의 기본
void main(){
List<String> blackPink = ['로제','지수','리사','제니'];
print(blackPink);
print(blackPink.asMap()); // 리스트를 맵으로 변환
print(blackPInk.toSet()); // 리스트를 set으로 변환
@ Map 생성
Map blackPinkMap = blackPink.asMap();
@ Iterable- () 괄호 형태, 일종의 리스트, 키와 value는 Iterable 형태
print(blackPinkMap.keys) // Iterable 형태로 출력된다
print(blackPinkMap.keys.toList()) // 리스트 형태로 출력된다.
@Set 생성
Set blackPinkSet = Set.from(blackPink);
print(blackPinkSet.toList());
}
map 함수 - 함수가 파라미터로 들어감
## List
@ 리스트를 새로운 리스트로
void main(){
List<String> blackPink = ['로제','지수','리사','제니'];
final newBlackPink = blackPink.map((x){ // 파라미터로 블랙핑크 리스트의 값들이 차례로 들어오고 리턴 값이 리스트 값을 대체한다. map 함수는 새로운 리스트를 Iterable 형태로 생성한다 newBlackPink와 blackPink는 같지 않다.
return '블랙핑크 $x'
});
print(blackPink);
print(newBlackPink.toList());
final newBlackPink2 = blackPink.map((x)=> '블랙핑크 $x').toList(); // 더 간단한 형태
}
## Map
void main(){
Map<String, String> harryPotter = {
'Harry Potter' : '해리포터',
'Ron Weasely' : '론 위즐리',
'Herimione Granger' : '헤리미온느 그레인저'
};
@ map을 새로운 map으로
final result = harryPotter.map((key,value)=>MapEntry(
'Harry Potter Character $key','해리포터 캐릭터 $value',
)); // 키와 value가 한 세트씩 각각 맵핑됨
}
@ map의 키를 새로운 키로 변경, value를 새로운 value로 변경
final keys = harryPotter.keys.map((x)=> 'HPC $x').toList();
## Set
void main(){
Set blackPinkSet = {
'로제',
'지수',
'제니',
'리사',
};
final newSet = blackPinkSet.map((x)=> '블랙핑크 $x' ).toSet();
}
## Where
void main(){
List<Map<String, String>> people = [
{ 'name' : '로제', 'group' : '블랙핑크'},
{ 'name' : '지수', 'group' : '블랙핑크'},
{'name' : '뷔', 'group' : 'bts'}
];
final blackPink = people.where((x)=>x['group']=='블랙핑크'); // true 인것만 return 되어서 그룹이 블랙핑크인 사람들만 남음
}
## Reduce
void main(){
List<int> numbers = [
1,3,5,7,9,
];
final result = numbers.reduce((prev,next){ // numbers.reduce((prev,next)=> prev+next);도 같은 결과
print('-----');
print('previous : $prev');
print('next : $next');
print('total : ${prev + next}');
return prev + next; // 이 return값이 다음 값의 prev가 됨 , 다음 리스트값이 next 가 됨
});
print(result);
}
// 결과 previous : 1 next : 3 total : 4 / previous : 4 next : 5 total : 9 / previous : 9 next : 7 total : 16 / previous : 16 next : 9 tptal : 25
마지막 print(result)의 결과는 마지막 return 결과 25
@ reduce를 쓸 때 그 리스트 값의 데이터 타입과 reduce 리턴값의 데이터 타입이 무조건 같아야함. string의 length를 리턴하는 reduce 함수를 만들면 에러가 남
## Fold - reduce와 달리 리턴값의 데이터 타입과 리스트 값의 데이터 타입이 달라도 됨.
void main(){
LIst<int> numbers = [1,3,5,7,9];
numbers.fold<int>(0,(prev, next) => prev+next); // 시작할 값(=0 인덱스가 아님)이 파라미터로 들어감, 리턴할 값의 타입을 제너릭으로 명시해줌
}
## Cascading Operator - 여러 리스트를 하나로 합칠 때
void main(){
List<int> even = [2,4,6,8,];
List<int> odd = [1,3,5,7,];
print([even, odd]); // 결과 : [[2,4,6,8],[1,3,5,7]]
@ Cascading Operator
print([...even, ...odd]); // 결과 : [2,4,6,8,1,3,5,7]
// [...even], even 두 리스트의 값은 완전히 같지만 다른 리스트임
}
## 모든 데이터는 클래스로 구조화하는 것이 안정적
List<Map<String, String>> people= [
{ 'name' : '지수', 'group':'blackPink'},
{ 'name' : '제니', 'group':'blackPink'},
{ 'name' : '뷔', 'group':'BTS'},
]
class Person {
final String name;
final String group;
Person({required this.name, required this.name})
}
final parsedPeople = people.map((x)=> Person(name: x['name']!, group:x['group']!),).toList(); // name, group이라는 키가 무조건 있다는 것을 느낌표로 명시, people이라는 리스트의 값들을 Person이라는 클래스를 이용하여 인스턴스화된 리스트 생성
print(parsedPeople); 하면은 (Instance of 'Person', Instance of 'Person', .....) 이것이 기본값
Person 클래스 내에 toString함수를 override해준다.
@override
String toString(){
return 'Person(name:$name, group : $group)';
}
@ 어떤 값들이 있는지, 어떤 기능이 있는지 확인 가능, 데이터 선에서 에러가 나는 것을 최소화
for(Person person in parsedPeople){
print(person.name);
print(person.group);
}
final bts = parsedPeople.where((x)=>x.group=='BTS',);
@ functional programming은 함수들을 연결 가능
final result = people.map((x)=> Person(name: x['name']!, group:x['group']!),).where((x)=>x.group=='BTS',); // 한번에 가능
@ 주의 해야할점 : 너무 길게 하면은 안됨- 간결하게 이어서
'Flutter > Dart' 카테고리의 다른 글
Dart 비동기 프로그래밍 Asynchronous Programming (0) | 2023.07.07 |
---|---|
Dart 객체 지향 프로그래밍 OOP (0) | 2023.07.06 |
Dart 언어 기본기 (0) | 2023.07.05 |
Dart Map - entries, asMap (0) | 2023.02.10 |
Dart List - forEach, map, reduce, fold (0) | 2023.02.10 |