- 値の集合に対する処理を使い回す仕組みが「Stream」らしいです。
SampleCode
projava/StreamSample2.java
package projava;
import java.util.List;
public class StreamSample2 {
public static void main(String[] args) {
var data = List.of("yamamoto", "kis", "sugiyama");
var result = 0;
for (var s : data){
if (s.length() >= 5){
result++;
}
}
System.out.println(result);
}
}
こちらはListから5文字以上の文字列を抜き出して、新しいListを作る処理です。
実行結果として、「yamamoto」「sugoyama」が5文字以上なので「2」が表示されます。
コードでは、個数を数えるための変数resultを用意し、0を入れ、
var result = 0;
ループの中で条件を満たした文字列があった場合、値を1増やします。
result++;
こちらをStreamを使った処理に変換します。
(IntelliJ IDEAの機能を使い置換しています。)
var result = (int) data.stream() //Streamソース
.filter(s -> s.length() >= 5) //中間処理
.count(); //終端処理
System.out.println(result);
「var result = 0;」から「System.out.println(result);」までがStreamへと置き換わっています。
Streamの処理は、
値の集合からStreamを取り出す「Streamソース」、
値を操作する「中間処理」、
値をまとめる「終端処理」
の3つに分かれます。
ここではListからStreamソースを取り出して、中間処理として5文字以上の文字列を処理する様フィルターし、
最後に終端処理として個数を数えています。
Steram処理は基本的にメゾッドの呼び出しを続けて書く「メゾッドチェーン」の形で書きます。
Javaでは「;」までが1行とみなされ、改行はスペースと同じ扱いなので「.」から始まるよう改行する書き方がよく使われるそうです。
SteramソースはStreamの取り出し口となります。
ListからStreamを取り出すときにはstreamメゾッドを使います。
var result = data.stream()
Streamに流れる値を変換したり、取り捨て選択するのが中間処理です。
中間処理の様に、Streamではラムダ式が多く使われます。
.filter(s -> s.length() >= 5)
ラムダ式は以下の様な形式となります。
受け取った値を使うための変数 -> 処理
Streamでの処理から最終的な結果を取り出すのが終端処理です。
.count();