void main() {
// Looping
List<String> redVelvet = [
'아이린',
'슬기',
'웬디',
'조이',
'예리',
];
// Looping - for loop
for (int i = 0; i < redVelvet.length; i++) {
print(redVelvet[i]);
}
print('--------------');
// Looping - for in
for (String value in redVelvet) {
print(value);
}
print('--------------');
// Looping - forEach
// forEach는 return 값을 안 받는다.
redVelvet.forEach((value) {
print(value);
});
}
void main() {
// Mapping
List<String> redVelvet = [
'아이린',
'슬기',
'웬디',
'조이',
'예리',
];
// Mapping - map
// map에서는 return 값을 받을 수 있다.
// newList는 함수 안에서 리턴해준 값들이 각각 값에 '새로운 값'으로 집어넣는다.
final newList = redVelvet.map((value) {
return '제 이름은 $value입니다.';
});
print(
newList); // (제 이름은 아이린입니다., 제 이름은 슬기입니다., 제 이름은 웬디입니다., 제 이름은 조이입니다., 제 이름은 예리입니다.)
// redVelvet List는 변경되지않았다.
print(redVelvet); // [아이린, 슬기, 웬디, 조이, 예리]
// 정리
// mapping을 하면 새로운 List를 만들 수 있는데, 원래 있는 List를 기반으로 새로운 List를 제작할 수 있다.
// 주의
// map을 사용하면 ()가 나오는 이유는 => map 위에 마우스를 올리면 => map은 Iterable을 리턴한다고 되어있다.
// Iterable을 상속(inheritance)에서 List보다 더 부모인 class라고 보면 된다.
// Iterable, ()로 나온 것을 List로 바꾸고 싶다면 'toList()'라고 함수를 실행하면 된다. ***
print(newList.toList()); // [제 이름은 아이린입니다., 제 이름은 슬기입니다., 제 이름은 웬디입니다., 제 이름은 조이입니다., 제 이름은 예리입니다.]
}
void main() {
// Reduce/Fold
List<String> redVelvet = [
'아이린',
'슬기',
'웬디',
'조이',
'예리',
];
// Reduce/Fold = reduce, fold
// #1 Fold
// => Fold는 각각의 값들을 Looping 하면서, 그 값들을 이용해서 total을 쌓아가는 역할을 한다.
List<int> numbers = [
0,
1,
2,
3,
4,
5,
];
// fold는 position 매개변수가 2개가 들어간다
// fold(처음에 시작할 값, 함수(a, b))
int total = numbers.fold(0, (total, element) {
// 각각의 값들이 element에 들어가고, looping을 할 때마다 처음에는 0부터 시작하고,
// total이라는 값은 return되는 값이 다음 looping할 때, total 값이 된다.
return total + element;
});
print(total); // 15
// fold는 값을 쌓아갈 때, 많이 사용된다
// 진행과정
// index = 0
// element = 0
// total = 0
// return = 0 + 0 = 0
// index = 1
// element = 1
// total = 0
// return = 0 + 1 = 1
// index = 2
// element = 2
// total = 1
// return = 1 + 2 = 3
// index = 3
// element = 3
// total = 3
// return = 3 + 3 = 6
//...
print('-------------------------------------------------------');
// #2 Reduce
// Reduce는 position 매개변수로 함수 하나를 받는다
// Reduce는 fold와 다르게 시작하는 값을 받지 않고, 나머지는 같다
// Reduce에는 total에 numbers의 첫 번째 숫자가 들어간다
int total2 = numbers.reduce((total, element) {
return total + element;
});
print(total2); // 15
print('-------------------------------------------------------');
// 왜 Reduce와 Fold 두 가지가 필요할까?
// => Reduce는 시작 값을 생략하기때문에 numbers의 각각의 element 타입과 리턴해주는 타입이 똑같아야한다.
// => 각 element 타입과 reduce를 사용해서 리턴되는 값이 다르면, reduce를 사용할 수 없다.
List<String> names = [
'코드팩토리',
'레드벨벳',
'BTS',
];
// fold 사용
int total3 = names.fold(0, (total, element) {
return total + element.length;
});
print(total3); // 12
// reduce 사용
// final total4 = names.reduce((total, element) {
// return total + element.length; // error => 각각 값이 String인데, 리턴 값이 int가 될 수 없다
// });
}
void main() {
List<String> redVelvet = [
'아이린',
'슬기',
'웬디',
'조이',
'예리',
];
List<int> numbers = [
0,
1,
2,
3,
4,
5,
];
// arrow function(화살표 함수)
// 여러 줄의 코드가 아닌 한 줄의 코드로만 리턴한다면, 화살표 함수를 활용할 수 있다.
int total3Arrow = numbers.reduce((total, element) => total + element);
print(total3Arrow); // 15
// Mapping - map에 화살표 함수 활용
final newList = redVelvet.map((value) {
return '제 이름은 $value입니다.';
});
print(newList);
final newListArrow = redVelvet.map((value) => '제 이름은 $value입니다.');
print(newListArrow.toList());
}
void main() {
Map fruits = {
'Apple': '사과',
'Banana': '바나나',
'Kiwi': '키위',
};
// keys, values
print(fruits.keys); // (Apple, Banana, Kiwi)
print(fruits.values); // (사과, 바나나, 키위)
// Iterable 타입을 List로 바꾸고싶다면? toList()
print(fruits.keys.toList()); // [Apple, Banana, Kiwi]
print(fruits.values.toList()); // [사과, 바나나, 키위]
// List로 바꾸면 왜 유용할까?
// => reduce, fold, map, forEach 등, List의 메서드들을 다 사용할 수 있다
print('-----------------------------');
// Mapping - map => (entries)
// entries를 mapping하면 key 값과 value 값을 모두 가져올 수 있다.
// 제일 위와 다르게, keys가 아니라 key고, values가 아니라 value에 접근한다.
final newFruits = fruits.entries.map((entry) {
final key = entry.key;
final value = entry.value;
return '$key는 한글로 $value입니다.';
});
print(
newFruits); // (Apple는 한글로 사과입니다., Banana는 한글로 바나나입니다., Kiwi는 한글로 키위입니다.)
// 따라서, mapping할 때, key 값과 value 값을 사용할 수 있다.
print('-----------------------------');
// ForEach
fruits.entries.forEach((entry) {
final key = entry.key;
final value = entry.value;
print('$key는 한글로 $value입니다.');
// Apple는 한글로 사과입니다.
// Banana는 한글로 바나나입니다.
// Kiwi는 한글로 키위입니다.
});
// Reduce/Fold
final total = fruits.entries.fold(0, (dynamic total, dynamic entry) {
return total + entry.key.length;
});
print(total); // 15 => 가 나와야하는데, Null Safety 때문에 Error 발생
print('-----------------------------');
List<int> numbers = [
10,
20,
30,
40,
50,
];
// map을 사용하면 index 값을 알기가 쉽지 않다.
final newMap2 = numbers.map((item) {
return '값이 $item 입니다,';
});
print(newMap2);
// 쉽게 index와 value 값을 통째로 받는 방법
// key 값으로 index가 들어가고, value 값으로 List의 값이 들어가서 Map으로 리턴이 된다.
final newMap3 = numbers.asMap();
print(newMap3); // {0: 10, 1: 20, 2: 30, 3: 40, 4: 50}
// 어떻게 사용해야할까?
// index 값과 value 값을 동시에 mapping 할 수 있다.
// 이걸 응용해서 forEach를 사용할 수 있고, reduce, fold 등 다른 List 메서드에도 사용할 수 있게 된다!
final newMap4 = numbers.asMap().entries.map((entry) {
// index를 entry.key라는 getter로 가져올 수 있다.
final index = entry.key;
final value = entry.value;
return 'index가 $index일 때 값은 $value입니다.';
});
print(newMap4.toList());
// [index가 0일 때 값은 10입니다., index가 1일 때 값은 20입니다., index가 2일 때 값은 30입니다., index가 3일 때 값은 40입니다., index가 4일 때 값은 50입니다.]
}