Javaで配列・Listの宣言方法からstreamでの操作までまとめ

こちらの記事は[ユアマイスターアドベントカレンダー２０２０](https://adventar.org/calendars/5455)の９日目の記事です

こんにちは！！！！

## 今回のテーマ
Javaで配列・Listの宣言方法からstreamAPIを使ってListの操作を行うまでの方法をまとめます。

## なぜこのテーマにしたのか
- Javaを書いている時に個人的によく使う＆使いやすいものがStreamAPIなので
- 最近Java書いてないから忘れてきたので勉強し直すことが目的


### 配列の宣言・初期化・データの取得方法

方法１

```Java
String prefectures[] = new String[2]; // 変数の宣言＆要素数の設定をする
prefectures[0] = "東京"; // index = 0番目に東京がはいる
prefectures[1] = "神奈川"; // index = 1番目に神奈川がはいる
prefectures[2] = "沖縄"; // ArrayIndexOutOfBoundsException
String tokyo = prefectures[0]; // index = 0番目を取得
System.out.println(tokyo); // 東京
```

// 方法２

```Java
String prefectures[] = {"東京", "神奈川"}; // 初期化
prefectures[2] = "沖縄"; // ArrayIndexOutOfBoundsException
String tokyo = prefectures[0]; // index = 0番目を取得
System.out.println(tokyo); // 東京
```

配列は宣言時に要素数が決まるので増やすも減らすもできません。
存在しない要素にアクセスした場合は `ArrayIndexOutOfBoundsException`が起きます。


### Listの宣言・初期化・データの取得方法

```Java

// 宣言
ArrayList<String> members = new ArrayList<String>();

// データの追加→取得方法その１
members.add(0, "田中"); // 第一引数→index, 第二引数→入れたいデータ
String tanaka = members.get(0); // index = 0番目を取得
System.out.println(tanaka); // 田中

// データの追加→取得方法その２
members.add("岡田"); // 勝手にindex=１で追加される
String okada = members.get(1); // index = 1番目を取得
System.out.println(okada); // 岡田

members.add(5,"山田"); // IndexOutOfBoundsException
```

Listはデータを増やすも減らすも自由ですが、index数を順番通りに入れないと例外が起きます。

```Java
ArrayList<String> members = new ArrayList<>();
```

ちなみに宣言時の二個目のダイヤモンド演算子は省略可能です↑

## StreamAPIを使ったListの処理

### filter

ユースケース：特定のデータのみListからFilterかけたい時

```java
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6);
List<Integer> evenNumber = numbers.stream().filter(num -> num % 2 == 0).collect(Collectors.toList());
// 偶数のみListで取得し直す
System.out.println(evenNumber); // [2, 4, 6]
```

### map

ユースケース：要素全てに同じ操作を行いたいとき

```java
public void numbersTwiceExecute(){
    List<Integer> numbers = Arrays.asList(1, 2, 3);
    List<Integer> twiceNumbers = numbers.stream().map(this::twiceNumber).collect(Collectors.toList());
// Listの中身全てを２倍にした
    System.out.println(twiceNumbers); // [2, 4, 6]
}

public Integer twiceNumber(Integer number){
    return number * 2;
}
```

### sorted

ユースケース：並び替えしたい時

事前にこちらのクラスを実装してください↓

```java
public class User {
    int age;
    String name;

    public User(int age, String name){
        this.age = age;
        this.fullname = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setFullname(String name) {
        this.name = name;
    }
}
```



```java
public void sortedByAge(){
    User user1 = new User(20,"山田花子");
    User user2 = new User(10,"小野ヨーコ");
    User user3 = new User(5,"田中愛");
    List<User> users = Arrays.asList(user1, user2, user3);
    users.forEach(user-> System.out.print(user.getAge() + "才 "));
// 20才 10才 5才 

    List<User> sortedByAgeUsers = users.stream().sorted(Comparator.comparing(User::getAge)).collect(Collectors.toList());
    sortedByAgeUsers.forEach(user -> System.out.print(user.getAge() + "才 "));
// 5才 10才 20才
// 年齢順にソートされました
}
```


### anyMatch

ユースケース：リストに特定のデータを含んでいるか確認したい時

```java
    List<Integer> numbers = Arrays.asList(1, 2, 3);
    boolean existOddNumber = numbers.stream().anyMatch(num -> num % 2 == 1);
    // Listに奇数が含まれているかの確認
    System.out.println(existOddNumber); // true
```

## 感想
StreamのおかげでListの処理はだいぶ楽＆可読性が上がると思いました。
これからも積極的に使っていきたいです。