Map을 Mapping 하는 법으로 시작
일단 Map형태로 해리포터를 만들어 줬다.
혹시 Map이 가물가물 하다면 이전 글을 참고하자. 맨 아래쪽에 있다.
등장인물의 영문 이름과 한글 이름을 String으로 받았다.
harryPorter란 맵을 새로운 맵으로 받아주기 위해 result를 만들었다.
Mapping을 해주기 위해 map()을(얘는 Mapping의 map) 썼는데 Map 형태는 <'key', 'value'> 두 가지가 들어가지 않았는가?
그래서 Map을 Mapping 하려면 두 가지가 필요하다. key는 k, value는 v라고 지정해보겠다.
MapEntry라는 Class를 통해 Map의 형태를 Mapping 해서 result에 넣어주면 된다.
결과는
result라는 Map에만 캐릭터가 들어간 것을 보니 원하는 대로 결과물이 나왔다.
아 여러분 이렇게 Map을 Map으로 바꾸는 일은 잘 없다고 한다.... 알고는 있자.
Map의 Parameter 값들을 List로 변경을 할 때
바로 코드를 보자
'keys'와 'values'를 받을 변수를 만들어 주고 map()을 하면 Iterable로 리턴이 되니. toList로 마무리.
쉽지요?
결론 : Map을 Mapping 하는 건
1. Map to Map
2. 'key or value' to map
위 두 가지 경우
Set의 mapping
또 set 안 해보면 서운하니까 난 안 서운했음 set도 한번 해보자.
방금 한 것과 똑같은 이치다. map()을 하면 Iterable로 리턴이 되니 toSet()로 마무리.
Where
이놈이 드디어 나왔다. Stream 계속하려다가 Where에서 막혀서 돌아 돌아온 것이
이놈 때문이었다. 무슨 수를 써서라도 마스터하고 가자. 이거 갱장히 많이 쓰는 기능이다.
예시 바로 긔
맞다. 안다. 동공 지진 왔을 거라 생각한다. 적어도 난 그랬다.
List안에 Map으로 넣어버렸다. 와... 진짜 개발자 형들은 상상하는 대로 다 구현하나 보다.
저런 것도 되는구나.
결과는 들어있는 내용이
그대로 잘 나온다. 자 이제 where 들어간다.
Where는 원하는 조건을 true or false로 필터링해서 truel일 경우 새로운 변수에 저장해주는 놈이라고 생각하자.
형태는 map()을 썼을 때처럼 안에 함수가 들어가며
여기서는 'value'에 'group'이 '블랙핑크'인 놈을 찾으면 True, 아닐 경우 False를 리턴해 준다.
True일 경우에만 'blackPink'에 값을 저장해 주니 출력해보면 블랙핑크만 남고 BTS는 지워준다.
Reduce
리스팅 되어 있는 값들을 두 개씩 돌려가며 마지막까지 연산하여 리턴한다. 예시를 보면 특징이 딱 보인다.
numbers에 1,3,5,7을 넣어줬고
result에 reduce함수를 썼다. reduce는 두 개의 int parameter를 받는데 순서가 있어서 'prev', 'next'로
지정해줬다. 함수가 실행될 때마다 구분선'-------------'으로 구분해주고
previous 값과 next값 그리고 합한 값을 출력해준다. 결과를 보자.
첫 번째 함수를 돌리니 1+3=4라고 잘 나왔다.
두 번째 함수를 돌리니 prev에 4가 들어간 게 보이는가?
reduce 특징 : 처음 loop는 순서대로 넣고
그다음 loop는 처음의 결괏값에 다음 값을 연산한다.
이렇게 세 번째 함수까지 하고 total값을 리턴하여 result :16으로 마무리했다.
String으로 reducing 하기
바로 예시 긔
결과가 어떻게 될 것 같은가? 나는 오래 걸렸지만 여러분은 금방 하리라 믿는다.
헷갈린다면 예시를 몇 번 돌려보면 감이 올 것이다!!
reduce 주의점
reduce가 절대적으로 지켜야 하는 점은 각각 선언되는 List의 타입과 reduce 해서 집어넣어 준 변수의
형태와 같아줘야 한다는 것이다. 절대 절대 절대 절대 잊으면 안 된다.
아래에 같은 색으로 박스 쳐 놓았다. (feat. 박보검)
Fold
이번은 Fold다.
Fold는 같은 타입을 리턴해줘야 하는 단점을 보완해준 놈이다.
fold()도 두 개의 parameter를 받는다. 첫 번째 parameter는 시작할 값, 두 번째는 함수.
reduce는 list는 선언된 타입과 같아야 한다그랬잖슴까?
fold는 그렇지 않다. 그래서 타입을 선언해줘야 한다. <int>로 해줬다.
fold는 첫 번째 값을 지정할 수 있어서 '0'을 해줬는데 정확히 시현됐다.
나머지는 reduce와 똑같이 실행됐다.
이제 fold와 reduce의 차이점을 봐보자.
하이틴 스타 박보검 씨를 다시 모셨다.
'. length'는 String의 길이를 리턴한다. 즉, 글자 수를 세준다.
reduce에서는 List와 같은 형태를 리턴해야 하니 글자 수를
리턴할 수가 없었는데 fold에서는 직접 지정해줄 수 있으니
정상적으로 16이라는 값이 출력이 된다.(띄어쓰기와 물음표까지 다 세어줘야 한다.)
오늘 배운 것
dart에서 쓰는 mapping과 where, reduce, fold까지 야무지게 배워봤다.
mapping을 통해 여러 타입 간 전환을 할 수 있었고
where를 통해 필터링을 했다.
reduce는 같은 형태의 list를 리턴해주는 loop문이었고
fold는 형태를 지정해서 리턴 값을 받을 수 있는 loop였다.
아무튼 오늘은 여기까지 이며
야무지게 오늘 하루도 공부했으리라 믿는다.
내일은 함수형 프로그래밍 포스팅이 끝나게 되리라 소망해보자.
틀린 점이나 궁금한 점이 있으면 댓글로 알려달라.
입문자라 아무것도 모르고 이상한 소리를
썼을 가능성이 매우 매우 농후하다.
궁금한 점은 댓글로 토론하며 정답을 찾아보자.
코드팩토리님의 Dart강의를 보고 공부 중입니다.