함수형 프로그래밍

shin·2022년 9월 7일
0

Dart

목록 보기
17/20

형 변환

List

  • List를 List의 내장함수 asmap()을 사용해서 Map으로 형변환을 할수 있다.
  • key 값에는 인덱스, value에는 list의 값들이 들어가게 된다.
void main (){
  List<String> fruit = ['banana', 'apple','lemon','mango'];
  
  print(fruit);
  print(fruit.asMap());
}
=>
[banana, apple, lemon, mango]
{0: banana, 1: apple, 2: lemon, 3: mango}
  • toSet()을 사용하여 형변환을 할 수 있다.
void main (){
  List<String> fruit = ['banana', 'apple','lemon','mango','mango'];
  
  print(fruit);
  print(fruit.toSet());
}
=>
[banana, apple, lemon, mango, mango]
{banana, apple, lemon, mango}
void main (){
  List<String> fruit = ['banana', 'apple','lemon','mango','mango'];
    
  Map fruitMap = fruit.asMap();
  print(fruitMap.keys);
  print(fruitMap.values);
}

=>
(0, 1, 2, 3, 4)
(banana, apple, lemon, mango, mango)

  print(fruitMap.keys.toList());
  print(fruitMap.values.toList());
 
 =>
  [0, 1, 2, 3, 4]
  [banana, apple, lemon, mango, mango]
  • key 와 value 값을 list 값으로 불러올 수 있다.
  • 불러온 값에 ()가 사용되었는데 iterable이라고 한다. iterable은 잘 사용하지는 않고 list나 다른 형태로 바꿔서 사용한다.

map()

void main() {
  List<String> fruit = ['banana', 'apple', 'lemon', 'mango', 'mango'];
  // 첫번째 파라미터에 각각의 리스트 값을 받는다.
  // 함수에 무언가를 리턴해 줘야 한다.
  // 리스트에 있는 값들이 한개씩 반환되어 새로운 리스트를 만든다.
  final newFruit = fruit.map((x) {
    return '과일 $x';
  });

  print(fruit);
  print(newFruit.toList());
  
  // arrow 함수를 사용해서 코드를 간단히 할 수 있다.
  final newFruit2 = fruit.map((x)=>'과일 $x');
  
  print(newFruit2.toList());
}

// [1.jpg,2.jpg,3.jpg,4.jpg,5.jpg]
  String number = '12345';
    
  final parsed = number.split('').map((x)=>'$x.jpg').toList();
  
  print(parsed);

map 활용

void main() {
  final number = 123;

  print(number.toString().split('').map((x) => '$x.jpg').toList());

  final numbers = [
    123,
    456,
    789,
  ];
  
  print(
    numbers.map(
      (x) => x.toString().split('').map(
            (y) => '$y.jpg',
      ).toList(),
    )
  );
}
  print(numbers.asMap().entries.toList()[0].key);

[1.jpg, 2.jpg, 3.jpg]
([1.jpg, 2.jpg, 3.jpg], [4.jpg, 5.jpg, 6.jpg], [7.jpg, 8.jpg, 9.jpg])
0

Set

  • List와 같은 형식이다.
void main() {
  Set fruit = {
    'banana', 'apple','lemon','mango'
  };
  
  final newSet = fruit.map((x) => '과일 $x').toSet();
  
  print(newSet);
}




Map

void main() {
  Map<String, String> fruit = {'banana': '바나나', 'apple': '사과', 'lemon': '레몬'};
// Map에서 map()을 사용할 때 key, value파라미터가 2개를 사용해야 한다.
  final result = fruit.map(
    (key, value) => MapEntry('fruit $key', '과일 $value'),
  );

  print(fruit);
  print(result);
  
// key, value 를 각각 불러서 사용할 수도 있다.  
  final key = fruit.keys.map((x)=>'fruit $x').toList();
  print(key);
  final value = fruit.values.map((x) => '과일 $x').toList();
  print(value);
}

where

  • List의 값들을 루핑하면서 true 또는 false 값을 돌려준다.
  • 값이 true면 출력되고 false면 삭제된다.
void main() {
 List<Map<String, String>> eat = [
   {
     'name' : '사과',
     'group' : '과일'
   },
   {
     'name' : '바나나',
     'group' : '과일'
   },
   {
     'name' : '양파',
     'group' : '채소'
   },
   {
     'name' : '마늘',
     'group' : '채소'
   },   
 ];
  
  print(eat);
  
  
  // group의 값에 따라 name이 출력된다.
  final fruit = eat.where((x)=>x['group'] == '과일').toList();
  final vegetable = eat.where((x)=>x['group'] == '채소').toList();
  
  print(fruit);
  print(vegetable);
}

[{name: 사과, group: 과일}, {name: 바나나, group: 과일}, {name: 양파, group: 채소}, {name: 마늘, group: 채소}]
[{name: 사과, group: 과일}, {name: 바나나, group: 과일}]
[{name: 양파, group: 채소}, {name: 마늘, group: 채소}]

reduce

  • 총 합을 구할 때 사용한다.
void main() {
 List<int> numbers = [
   1,
   3,
   5,
   7,
   9
 ];
  
  final result = numbers.reduce((prev, next){
    print('-----------------');
    print('previous : $prev');
    print('next : $next');
    print('total : ${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
total : 25
25
  • arrow 함수를 사용하여 코드를 간단히 할 수 있다.
void main() {
 List<int> numbers = [
   1,
   3,
   5,
   7,
   9
 ];
  
  final result = numbers.reduce((prev, next) => prev + next);
  print(result);
}
  • 다음과 같이 String을 사용해서 쓸 수 있다
void main() {
  
  List<String> words = [
    '안녕하세요 ',
    '저는 ',
    'Tom입니다'
  ];
  
  final sentence = words.reduce((prev, next) => prev + next);
  print(sentence);
}

안녕하세요 저는 Tom입니다
  • reduce 사용시 주의점은 다른 타입으로 리턴해 줄 수 없다.
void main() {
  
  List<String> words = [
    '안녕하세요 ',
    '저는 ',
    'Tom입니다'
  ];
  
  final sentence = words.reduce((prev, next) => prev.length + next.length);
  print(sentence);
}
// String 타입으로 받으면 String으로 반환해야한다. 위 코드에서는 길이 값인 int를 반환하게 되서 에러가 발생한다.

fold

  • reduce에서 하지 못했던 기능을 할 수 있다.
void main() {
  List<int> numbers = [1, 3, 5, 7, 9];

  final sum = numbers.fold<int>(0, (prev, next) {
    // fold<타입>에 출력될 타입을 지정해줘야 한다.
    // fold에 첫번째 인자는 초기값이다.
    print('-----------------');
    print('previous : $prev');
    print('next : $next');
    print('total : ${prev + next}');
    
    return prev + next;
  });
}

-----------------
previous : 0
next : 1
total : 1
-----------------
previous : 1
next : 3
total : 4
-----------------
previous : 4
next : 5
total : 9
-----------------
previous : 9
next : 7
total : 16
-----------------
previous : 16
next : 9
total : 25
  • reduce 기능을 fold로 사용할 수 있다.
void main() {
  
   List<String> words = [
    '안녕하세요 ',
    '저는 ',
    'Tom입니다'
  ];
  
  final sentence = words.fold<String>('', (prev, next) => prev + next);
  print(sentence);
}
안녕하세요 저는 Tom입니다
  • reduce에서 하지 못했던 다른 타입으로 출력을 fold에서는 할 수 있다.
void main() {
  
   List<String> words = [
    '안녕하세요 ',
    '저는 ',
    'Tom입니다'
  ];
    
  final sum = words.fold<int>(0, (prev, next) => prev + next.length); 
  // 초기값이 0 이기 때문에 prev에 length를 사용하지 않는다. 
  print(sum);
}
15

Spread 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]

0개의 댓글