[Java] ストリームAPI

ListやSetといったコレクションを扱う際に、すべての要素に処理を行う際、for文を使って順に要素を取り出していましたが、このような逐次処理を簡潔に記述できるようにしたStream<T>型がJava8で導入されました。

ここではStream API(以下ストリームAPI)の使い方についてまとめていきます。

ストリームAPIを使用する目的

ストリームAPIを使用する目的としては以下の通りです。

  • コレクションや配列の全要素に対して同じように変換する。
  • コレクションや配列の要素の合計や平均といった統計を取る。
  • コレクションや配列の要素に対して特定の条件でグルーピングやフィルターを行う。
  • コレクションや配列から特定の条件に合ったデータを検索する。
  • ストリームAPIは従来のfor文や拡張for文を置き換えるために用意されたAPIではない。

ストリームオブジェクトの取得

Iterableインターフェースから取得

java.lang.Iterableインターフェースのstream()メソッドで取得します。

コード例

List<String> list = new ArrayList<>();
list.add("Apple");
list.add("Melon");
list.add("Orange");
Stream<String> stream = list.stream();

Streamインターフェースから取得

コード例

Streamインターフェースのofメソッドからも可変長引数で取得することが出来ます。

Stream<String> stream = Stream.of("Apple", "Melon", "Orange");

Arraysクラスから生成

コード例

String[] arrays = {"Apple", "Melon", "Orange"};
Stream<String> stream = Arrays.stream(arrays);

並列ストリームインスタンスを取得

コード例

並列ストリームはコレクションに対する操作のパフォーマンスを上げるために、マルチスレッドをサポートしたストリームオブジェクトです。

parallelStreamメソッドで取得します。

List<String> list = new ArrayList<>();
list.add("Apple");
list.add("Melon");
list.add("Orange");
Stream<String> stream = list.parallelStream();

ストリームAPIのメソッド

ストリームAPIには関数型インターフェースを引数に取る様々なメソッドが用意されています。主なメソッドについて使用例を記載しておきます。

forEach

forEachメソッドは、ストリーム内の要素を使って繰り返し処理を実行します。

戻り値 void
引数 Consumer<T>

コード例

Stream<String> stream = Stream.of("Apple", "Melon", "Orange");
stream.forEach(x -> System.out.println(x));

実行結果

Apple
Melon
Orange

filter

filterメソッドは、ストリーム内の要素を特定の条件でフィルタリングするメソッドです。

戻り値 Stream<T>
引数 Predicate<T>

コード例

String[] arrays = {"Apple", "Melon", "Orange"};
Stream<String> stream = Arrays.stream(arrays);

stream.filter((x) -> {return x.length() == 5;})
        .forEach(System.out::println);

実行結果

Apple
Melon

sorted

sortedメソッドは、ストリーム内の要素に対して重複を取り除いた結果のStreamオブジェクトを返します。

引数のComparatorを指定し、compareメソッドをオーバーライドすることで並び順を制御できます。

戻り値 Stream<T>
引数 なし or Comparator<T>

コード例

String[] arrays = {"Melon", "Orange", "Apple"};
Stream<String> stream = Arrays.stream(arrays);

stream.sorted((x, y) -> {
            return x.compareTo(y);
        }).forEach(System.out::println);

※「x < y」の時に-1を返すことで昇順

実行結果

Apple
Melon
Orange

map

mapメソッドは、Streamの要素に対して何らかの処理を行い保存します。

戻り値 Stream<R>
引数 Function<T, R>

コード例

Integer[] arrays = {1, 2, 3, 4};
Stream<Integer> stream = Arrays.stream(arrays);

stream.map(x -> x * 2).
        forEach(System.out::println);

実行結果

2
4
6
8

reduce

mapメソッドは、Streamの要素の集計や結合などの、一つにまとめる操作を行います。この一連の要素を一つにまとめることをリダクション操作と言います。

戻り値 Optional<T>
引数 BinaryOperator<T>

コード例 1

Integer[] arrays = {1, 2, 3, 4};
Stream<Integer> stream = Arrays.stream(arrays);

Optional<Integer> optional = stream.reduce((x, y) -> x + y);
System.out.println(optional);

実行結果 1

Optional[10]

コード例 2

reduceメソッドは第一引数に初期値を指定することが可能で、初期値を指定した場合戻り値がOptionalではなく、初期値で指定した型になります。

Integer[] arrays = {1, 2, 3, 4};
Stream<Integer> stream = Arrays.stream(arrays);

Integer summary = stream.reduce(10, (x, y) -> x + y);
System.out.println(summary);

実行結果 2

20

max

maxメソッドは、Streamの要素から最大値を取得し、最大値を取得します。sortedメソッドと同じくComparatorインターフェースを引数に取りますが、引数なしにはできません。

戻り値 Optional<T>
引数 Comparator<T>

コード例

String[] arrays = {"Melon", "Orange", "Apple"};
Stream<String> stream = Arrays.stream(arrays);

Optional<String> val = stream.max((x, y) -< x.compareTo(y));
System.out.println(val);

実行結果

Optional[Orange]

コメント

このブログの人気の投稿

docker-compose up で proxyconnect tcp: dial tcp: lookup proxy.example.com: no such host

docker-compose で起動したweb、MySQLに接続できない事象

【PHP】PHP_CodeSnifferを使う(コーディングルールのカスタマイズ)