본문 바로가기

Flutter/Dart

Dart 함수형 프로그래밍 Functional Programming

반응형

출처 : 유튜브 코드팩토리 함수형 프로그래밍

형변환, 리스트, 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