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