StreamAPI はコレクションから作成したストリーム(データの流れ)に対して何かしらの処理をするためのAPIで、ラムダ式はこの StreamAPI と相性が良いので組み合わせて使用することが多いです。
StreamAPI の文法は以下の通りです。
リストの場合: リスト名.stream().中間操作.終端操作 マップの場合: マップ名.entrySet().stream().中間操作.終端操作
「中間操作」部ではソートやフィルタリングなどの中間処理を行います。
また「終端操作」部では繰り返し処理や集計、平均計算、再リスト化などの最終処理をおこないます。
今回は色々ある中間操作のうち、フィルタリングをおこなう「filter」について取り扱います。
また終端操作として繰り返しをおこなう「forEach」について取り扱います。
では具体的な例を見てみましょう。
以下の例では StreamAPI を使わずにリストに含まれる要素の中で15より大きい値を出力しています。
import java.util.ArrayList;
public class Main{
public static void main(String[] args) {
var list = new ArrayList<Integer>();
list.add( 10 );
list.add( 20 );
list.add( 30 );
for( var i : list ){
if( i > 15 ) System.out.println( i );
}
}
}
実行結果:
20
30
これと同じ処理を StreamAPI を使って書くと次のようになります。
中間操作部で値が15より大きい要素だけフィルタリングして取り出し、終端操作部で繰り返し処理を行っています。
import java.util.ArrayList;
public class Main{
public static void main(String[] args) {
var list = new ArrayList<Integer>();
list.add( 10 );
list.add( 20 );
list.add( 30 );
list.stream()
.filter( i-> i>15 ) // 中間操作
.forEach( i->System.out.println( i ) ); // 終端操作
}
}
実行結果:
20
30
次はマップでの StreamAPI の使用例を見てみましょう。
まず以下の例では StreamAPI を使わないでマップからキーが「札幌」である要素の値を出力しています。
import java.util.HashMap;
public class Main{
public static void main(String[] args) {
var map = new HashMap<String, Integer>();
map.put( "函館", 1 );
map.put( "札幌", 2 );
map.put( "旭川", 3 );
for( var i : map.entrySet() ){
if( i.getKey().equals("札幌") ){
System.out.println( "key = " + i.getKey() + ", value = " + i.getValue() );
}
}
}
}
実行結果:
key = 札幌, value = 2
これと同じ処理を StreamAPI を使って書くと次のようになります。
中間操作部でキーが「札幌」である要素だけフィルタリングして取り出し、終端操作部で繰り返し処理を行っています。
import java.util.HashMap;
public class Main{
public static void main(String[] args) {
var map = new HashMap<String, Integer>();
map.put( "函館", 1 );
map.put( "札幌", 2 );
map.put( "旭川", 3 );
map.entrySet().stream()
.filter( i -> i.getKey().equals("札幌") ) // 中間操作
.forEach( i -> System.out.println( "key = " + i.getKey() + ", value = " + i.getValue() ) ); // 終端操作
}
}
実行結果:
key = 札幌, value = 2