以下の記事はQiitaの@xrdnkさんが記述した「Stream API 入門」の紹介記事です。
Stream API とは
こちらの記事の続きみたいなものです.
Stream API はDataをPipeLine形式で処理するためのAPIです.
Collection,配列,ファイルなどデータの集合体(Data Source)から,個々の要素を取り出して
これを「処理の流れ」(Stream)に引き渡すための仕組みを提供します.
Streamに対して関数操作を行った結果をStreamで返す「中間操作」と
処理結果をDataとして返す「終端操作」があります.
中間操作も終端操作もメソッド引数は関数型インターフェースを取るものが多いため,
ここでラムダ式の知識が利用していくとスマートということになります.
Stream…?I/O Streamとは違う?
Javaにはjava.ioパッケージにI/O Streamが提供されていますが,
こちらのStreamの意味は入出力をStreamになぞらえた概念ですが,
Stream APIのStreamはDataのPipeLine処理をStreamに見立てた概念です.
Stream API の基本
import java.util.ArrayList;
import java.util.Arrays;
public class Main {
public static void main(String[] args) {
// ①Data Sourceを準備する
var list = new ArrayList<String>(
Arrays.asList("tokyo", "nagoya", "osaka", "fukuoka", "hokkaido", "okinawa"));
// ②ストリームを作る
list.stream().
filter(s -> s.length() > 5). // ③中間処理を行う
map(String::toUpperCase).
forEach(System.out::println); // ④終端処理を行う
// 結果:NAGOYA FUKUOKA HOKKAIDO OKINAWA
}
}
Stream APIの処理は以下で構成されます.
①Data Source準備する→②Stream生成→③抽出/加工などの中間処理→④出力/集計などの終端処理
上の例でいえば,
①まずArrayListのData Sourceを作る
②Streamを生成する.ここではArrayList
Streamメソッドも,Stream
※与えられるData Sourceの型によって型引数は変動することと,
Streamの途中で値が加工されることで,型が変化していく場合もある.
③filterメソッドで「文字数が5より大きい値だけを取り出す」
mapメソッドで「大文字に変換する」
中間処理は複数あってもよし.省略してもよし.
④forEachメソッドで,得られた値をSystem.out::printlnメソッドで出力
終端処理は省略できません.
中間処理の戻り値はいずれもStream
Stream APIでは,Streamの生成から中間処理/終端処理までを「.」演算子で
ひとまとめに連結でき,スマートな記述ができます.
(メソッドの連鎖という意味でメソッドチェーンと呼ばれる)
Streamの一連の処理が実行されるのは,終端処理のタイミングです.
中間で抽出/加工などの演算が呼び出されていても,それは一旦ストックされて,
その場では実行されず,終端処理まで処理の実施を待ちます.これを遅延処理といいます.
Stream の作り方
|
|
|
|
|