Stream基礎

## Stream APIって？
StreamはListなどに対する操作ができるクラスだよ。
for文の処理をよりスッキリかけるようなものだと思ってもらうといいと思うよ。
現場ではfor文を使わず、streamを使うことが多いので簡単に紹介するよ。

streamは中間処理といって絞り込みや要素の変換などを行う操作と、終端操作といって結果の取得や表示をする処理があるよ。
百聞は一見にしかず、実際に使ってみるよ。

## 具体例
### ①map
mapはstreamの各要素に対して指定の操作を行って返すよ。
今回はString型の数字をInteger型に変換して２倍にする操作を行うよ。
まずはfor文で書くよ。
```java
import java.util.ArrayList;
import java.util.List;

public class Main {
    public static void main(String[] args) {
        final var sampleList = List.of("1", "2", "3", "4", "5");

        final var convertList = new ArrayList<>();
        for (String sample : sampleList) {
            final var convert = Integer.parseInt(sample) * 2;
            convertList.add(convert);
        }

        convertList.forEach(r -> System.out.print(r + " "));
    }
}
```

Streamで書くとこんな感じになるよ。

```java
import java.util.List;

public class Main {
    public static void main(String[] args) {
        final var sampleList = List.of("1", "2", "3", "4", "5");

        final var convertList = sampleList.stream() //
            .map(r -> Integer.parseInt(r) * 2).toList();
            
        convertList.forEach(r -> System.out.print(r + " "));
    }
}
```

### ②filter
filterは元のオブジェクトのうち、指定した条件を満たすものを取り出すことができるよ。
今回は偶数の要素のみを取得するよ。

まずはfor文で書くよ。
```java
import java.util.ArrayList;
import java.util.List;

public class Main {
    public static void main(String[] args) {
        final var sampleList = List.of(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);

        final var evenNumList = new ArrayList<>();
        for(Integer num : sampleList) {
            if(num % 2 == 0) {
                evenNumList.add(num);
            }
        }

        evenNumList.forEach(r -> System.out.print(r + " "));
    }
}
```

Streamで書くとこんな感じになるよ。

```java
import java.util.List;

public class Main {
    public static void main(String[] args) {
        final var sampleList = List.of(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
        
        final var evenNumList = sampleList.stream().filter(r -> r % 2 == 0).toList();
        
        evenNumList.forEach(r -> System.out.print(r + " "));
    }
}
```

### ③おまけ
mapとfilterを同時に使うこともできるよ。

```java
import java.util.List;

public class Main {
    public static void main(String[] args) {
        final var sampleList = List.of(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);

        final var convertList = sampleList.stream() //
                .filter(r -> r % 2 == 0) //
                .map(r -> {
                    // mapで処理を複数書きたい場合は{}の中に処理を書いて、returnする
                    final var strNum = String.valueOf(r);
                    return strNum + ",";
                }).toList();

        convertList.forEach(System.out::print);
    }
}
```
こんな感じで使えるよ。これは`filter`で偶数を取り出して、さらに`map`でInteger型→String型への変換と`,`を付けたものをリストに入れているよ。

これをif文とfor文を使って書くとこれと同じことができるよ。
```java
import java.util.ArrayList;
import java.util.List;

public class Main {
    public static void main(String[] args) {
        final var sampleList = List.of(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);

        final var convertList = new ArrayList<>();
        for (Integer num : sampleList) {
            if (num % 2 == 0) {
                final var strNum = String.valueOf(num);
                convertList.add(strNum + ",");
            }
        }

        convertList.forEach(System.out::println);
    }
}
```

## まとめ
Streamを使うと、for文とif文で出来ることが簡潔にできるね。
コード量が減ったり可読性が上がってわかりやすいね。現場ではfor文を使うことも少ないので、Streamに慣れよう。