Dart復習メモ。主にListについて（初学者用）

Dart復習した覚え書き。
参考:
https://zenn.dev/joo_hashi/books/34fa9e03ab3440/viewer/ada115


# 関数
複数の値を返す場合

```
//返り値に二つの型を指定する。
(int, String) getMember(int number, String name) {
  return (number, name);
}

void main() {
  final gm = getMember(1, 'Taro');
  print(gm);// (1, Taro)
}
```

<h3>無名関数</h3>

```
void main() {
  final list = [1, 2, 3, 4, 5];
  //listの中にある要素itemを引数として受け取り表示
  list.forEach((item) {
    print(item);
  });
}
```
こっちでもいい
```
void main() {
  final list = [1, 2, 3, 4, 5];
  list.forEach((item) => print(item));
}
```

# List

```
void main() {
  //listが格納する値の型を<>の中に指定
  List<String> list = ['Hoge', 'Fuga', 'Foo'];
  // 2番目の要素を出力
  print(list[1]);// Fuga
}
```

<h3>Listに要素を追加していく</h3>

```
void main() {
  List<String> list = ['Hoge', 'Fuga', 'Foo'];
  list.add('Bar');
  print(list);//[Hoge, Fuga, Foo, Bar]
}
```

<h3>Listから要素を削除</h3>

```
void main() {
  List<String> list = ['Hoge', 'Fuga', 'Foo'];
  list.add('Bar');
  print(list);//[Hoge, Fuga, Foo, Bar]
}
```

<h3>Listの要素のindexを取る</h3>

```
void main() {
  List<String> list = ['Hoge', 'Fuga', 'Foo', 'Bar', 'Baz'];
  print(list.indexOf('Hoge')); // 0
  print(list.indexOf('Fuga')); // 1
  print(list.indexOf('Foo')); // 2
}
```

<h3>Listの要素を並び替える</h3>

```
void main() {
  // Listの要素を並び替える。どういう基準で並び替えられているのはようわからん。
  var names = ['山田', '佐藤', '鈴木'];
  names.sort();
  print(names); // [佐藤, 山田, 鈴木]　 
  // Listの要素を並び替える。並び替える基準を指定する
  var ages = [30, 40, 20];
  ages.sort((a, b) => 『a.compareTo(b));
  print(ages); // [20, 30, 40]
}
```

数字のsortの挙動をわかりやすくしてみるとこんな感じ。比較して、-1だった場合、入れ替えは発生しない。1だった場合は入れ替えが発生する。入れ替えが発生したら、入れ替えが発生した値でまだ比較されていない値同士を比較という感じだろうか。この辺はアルゴリズムに詳しい人の知見を求む。

```
void main() {
  var ages = [30, 40, 20];
  ages.sort((a, b)  {
    var result = a.compareTo(b);
    print(a);
    print(b);
    print(result);
    return result;
  });
  print(ages); 
  /*
    30
    40
    -1
    40
    20
    1
    30
    20
    1
    [20, 30, 40]
    
  */
}
```

<h3>条件に一致する要素を抽出</h3>

```
void main() {
  // whereメソッドで条件に一致する要素を抽出する
  var ages = [20, 30, 40, 50, 60];
  var filteredAges = ages.where((age) => age > 30);
  print(filteredAges); // (40, 50, 60)
}
```

<h3>要素をシャッフルシャッフルぅ！</h3>

```
void main() {
  List<String> list = ['Hoge', 'Fuga', 'Foo', 'Bar', 'Baz'];
  list.shuffle();
  print(list);//毎回並びが違くなる
}
```

<h3>foreachで回して各要素になんらかの処理を施す</h3>

```
void main() {
  List<String> list = ['Hoge', 'Fuga', 'Foo', 'Bar', 'Baz'];
  list.forEach((element) {
    print(element.toUpperCase()); //大文字で表示
  });
  
}
```

<h3>配列の要素を全て評価</h3>

```
void main() {
  List<String> list = ['Hoge', 'Fuga', 'Foo', 'Bar', 'Baz'];
  // 文字数が全部3以上だったらtrue、そうでなければfalse
  print(list.every((element) => element.length > 3));// false
}
```


```
void main() {
  List<String> list = ['Hoge', 'Fuga', 'Foo', 'Bar', 'Baz'];
  // 文字数が全部2以上だったらtrue、そうでなければfalse
  print(list.every((element) => element.length > 2));// true
}
```

<h3>map</h3>

```
void main() {
  List<String> list = ['Hoge', 'Fuga', 'Foo', 'Bar', 'Baz'];
  // 全部大文字にする
  final m = list.map((e) => e.toUpperCase());
  print(m);// (HOGE, FUGA, FOO, BAR, BAZ)
}
```

<h3>reduce</h3>

```
void main() {
  final numbers = <double>[10, 2, 5, 0.5];
  //全部足して要素を結合していき、一つにする。
  final result = numbers.reduce((value, element) => value + element);
  print(result); // 17.5
}
```