StreamAPI はコレクションから作成したストリーム(データの流れ)に対して何かしらの処理をするためのAPIで、ラムダ式はこの StreamAPI と相性が良いので組み合わせて使用することが多いです。

StreamAPI の文法は以下の通りです。

StreamAPIの文法

リストの場合: リスト名.stream().中間操作.終端操作

マップの場合: マップ名.entrySet().stream().中間操作.終端操作

「中間操作」部ではソートやフィルタリングなどの中間処理を行います。
また「終端操作」部では繰り返し処理や集計、平均計算、再リスト化などの最終処理をおこないます。

今回は色々ある中間操作のうち、フィルタリングをおこなう「filter」について取り扱います。
また終端操作として繰り返しをおこなう「forEach」について取り扱います。

では具体的な例を見てみましょう。
以下の例では StreamAPI を使わずにリストに含まれる要素の中で15より大きい値を出力しています。

ソース 1: 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より大きい要素だけフィルタリングして取り出し、終端操作部で繰り返し処理を行っています。

ソース 2: 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 を使わないでマップからキーが「札幌」である要素の値を出力しています。

ソース 3: 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 を使って書くと次のようになります。
中間操作部でキーが「札幌」である要素だけフィルタリングして取り出し、終端操作部で繰り返し処理を行っています。

ソース 4: 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