■StreamAPIのお約束
・streamAPIはCollectionインターフェースで定義されているメソッドの一種。
・下記の3部構成になっている。
①Streamを作成
②中間処理(なくてもいい)
③終端処理(1度だけ必ず行う)
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
public class Lesson {
public static void main(String[] args) {
List<String> fruits = new ArrayList<>(Arrays.asList("Apple", "Banana", "Cherry"));
fruits.stream()//1.streamの【生成】
.map(n -> n + "Cake") // 2. 各要素に "Cake" を結合【中間操作1】
.filter(n -> n.length() >= 10)// 3. 文字列の長さが10文字以上のものを抽出【中間操作2】
.forEach(n -> System.out.println(n));// 4. 抽出された要素を出力【終端操作※1度だけ必ず行う】
}
}
■Streamの構成について
①stream生成
処理したいリストにドットで繋げて.stream()と書く。
fruits.stream()
②中間処理
リストに対して処理したいメソッドを記述。
.map(n -> n + "Cake")
.filter(n -> n.length() >= 10)
中間処理で使う、代表的なメソッドいろいろ
▼map:変換
-> を挟んで左辺の引数の値を、右辺の値に変換して返す。
要素の変数の名前はnや、分かりやすい名前。(この例で言うとfruitとか)
変換したい値は計算式を入れたり、大文字変換のtoUpperCase()をかけたり。
.map(リスト内の要素を表す変数n -> nに対して変換したい値)
▼filter:条件による抽出
左辺の引数の値に対して、右辺の条件式がtrueとなるものを抽出する。
.filter(リスト内の要素を表す変数n -> nに対する条件)
▼distinct:重複削除
Stream内の要素の中で重複が無い状態にする。すべてユニークな要素。
.distinct()
▼limit:先頭から指定範囲を抽出
long型の引数に指定した数だけ、先頭から取り出す。(※0は数えず見たまんまの数を抽出。)
.limit(取り出したい要素数)
▼sorted:昇順ソート
昇順に並べ替える。引数は持たない。
sorted(Comparator.naturalOrder())と意味は同じ。
.sorted()
③終端処理
中間操作が0~複数個あったのに対し、終端操作は最後に1度だけ必ず行う。
例で使ったのは ▼forEach:要素を一つづつ取得し、各要素に対して処理する
ArrayListなどでも使うあのForEach文と全く同じ。
.forEach(n -> System.out.println(n));
その他の終端処理
▼collect(Collectors.toList())
streamの処理後の要素のリストを返す終端処理。
.collect(Collectors.toList());