🏭

JavaのStream APIを図で表してみる

2022/10/15に公開

この記事は

JavaのストリームAPIの動作イメージを図で表してみます。

想定読者

Javaの初心者

ストリームAPIは工場のラインのようなイメージ

ストリームAPIは工場のラインのようなものをイメージすると分かりやすいです。
ライン脇に、オブジェクトを加工する機械やオブジェクトを検査して不要なものを破棄する機械が配置されていて、ライン上を流れてくるオブジェクトを次々に処理します。

Stream APIを使ったコード

今回はこのコードを使用して、どのように処理が行われているか解説します。

List<String> list = List.of("cookie", "gum", "cake");

List<String> converted = list.stream()
    // cで始まる文字列のみ通す
    .filter(s -> s.startsWith("c"))
    // 大文字に変換する
    .map(s -> s.toUpperCase())
    // Listにまとめる
    .collect(Collectors.toList());

converted.forEach(s -> System.out.println(s));
// COOKIE
// CAKE
// が出力される

list.stram() でストリームを準備する

最初に、list.stream()でストリーム(工場のライン)の始点を準備します。

Stream<String> st = list.stream();

とりあえずこんなイメージです。

中間操作を記載する

ストリームの始点が準備できたら、中間操作を記載します。工場のラインに、機械や人を配置していくイメージです。

filter

filterは「検査」のイメージです。条件がtrueになるものは通し、falseになるものは取り除きます。
例では、受け取った値が"c"から始まる場合のみ通し、そうでない場合は取り除きます。

Stream<String> st = list.stream()
    // cで始まる文字列のみ通す
    .filter(s -> s.startsWith("c"));

始点につなげていきます。

map

mapは、正式には「写像」という意味ですが、ここでは「交換」をイメージしていきます。
受け取った値から、新たな値を作成し、次の工程に渡します。
例では、受け取った値を大文字に変換したものと交換します。

Stream<String> st = list.stream()
    // cで始まる文字列のみ通す
    .filter(s -> s.startsWith("c"))
    // 大文字に変換する
    .map(s -> s.toUpperCase());

図にするとこのようになります。

終端操作

終端操作は工場のラインの最終到達地点です。
例では、最終地点に来たオブジェクトをListに詰めます。

List<String> list = List.of("cookie", "gum", "cake");

List<String> converted = list.stream()
    // cで始まる文字列のみ通す
    .filter(s -> s.startsWith("c"))
    // 大文字に変換する
    .map(s -> s.toUpperCase())
    // Listにまとめる
    .collect(Collectors.toList());

図にするとこのようになります。

これで、ストリームのラインの完成です。

処理を始める

ラインが完成すると、この上をオブジェクトが流れ始めます。(ラインの組み立て途中ではオブジェクトが流れません)
また、1度に1つのオブジェクトしかラインに流すことができません。

1つ目のオブジェクトを流す

1つ目のオブジェクトをラインに流します。1つ目のオブジェクトは"cookie"です。
まず、filterで、"c"から始まるか検査されます。"cookie"は"c"から始まるので次に渡されます。

次に、mapで大文字に変換されたものと交換されます。

さらに、最終工程でListに追加されます。

2つ目のオブジェクトを流す

2つ目のオブジェクトをラインに流します。2つ目のオブジェクトは"gum"です。

まず、filterで、"c"から始まるか検査されます。"gum"は"c"から始まらないので、ラインから取り除かれます。

3つ目のオブジェクトを流す

3つ目のオブジェクトをラインに流します。3つ目のオブジェクトは"cake"です。
"cake"は"c"から始まるため、1つ目のオブジェクトと同様に、Listに格納されます。

このようにしてJavaのストリームは処理されます。

終わりに

以上がJavaのストリームAPIの動作イメージです。Javaの学習の助けになればうれしいです。

Discussion