JavaGold学習手記~StreamAPIについて~

概要

StreamAPIはJava SE 8 から採用された配列やコレクション、I/Oリソースなどのデータソースを元に集計操作を行うことができる
APIです。

データソース⇒中間操作①⇒中間操作②⇒終端操作

といった形で、データの加工を中間操作で行い、パイプラインの最後に行う処理を
終端操作と呼びます。

中間操作ができるメソッド、終端操作ができるメソッドがそれぞれjava.util.stream.Streamインターフェースで宣言されています。
かなり多くのメソッドがあり、暗記するのに一苦労しますが、この記事では、とりわけよく使うメソッドのいくつかを説明します。

試験対策ポイント

StreamAPIはJavaGold試験において、出題比率の非常に高い項目であり、学習する上で避けては通れない項目となります。

JavaGold試験対策としては下記の大きく5つの項目を抑えておけば問題ないでしょう。
①Streamの種類、生成
②終端操作
③Optionalクラス
④中間操作
⑤Collectorsクラス

Streamの種類、生成

Streamの種類

Stream…集約操作をサポートする汎用的なストリーム。

IntStream…int値のストリーム。intの他short,byte,char型に使用可能。

LongStream…long値のストリーム。

DoubleStream…double値のストリーム。float型にも使用可能。

Streamの生成

Collectionからストリームを生成するメソッド

※Collectionインターフェースで提供
・Stream stream()

配列からストリームを生成するメソッド

※Arraysクラスで提供
・Stream stream(T[] array)
・IntStream stream(int[] array)

指定した要素からストリームを生成するメソッド

※Streamインターフェースで提供
・Stream of(T t)
・Stream of(T… values)

※IntStreamインターフェースで提供
・IntStream range(int startIntclusive, int endExclusive)
・IntStream rangeClosed(int startInclusive, int endInclusive)

空のストリームを生成するメソッド

※Streamインターフェースで提供
・Stream empty()

ストリームオブジェクトの生成例

List data = Arrays.asList(“a”,”b”,”c”);
Stream stream = data.stream();

int[] data1 = {1,2,3};
IntStream stream1 = Arrays.stream(data1);

IntStream stream2 = IntStream.rangeClosed(0, 10);
//0~10を含む範囲の順次IntStreamオブジェクトを生成

終端操作

※一つのStreamオブジェクトに対して、終端操作は一度しか呼び出せない。

allMatch(),anyMatch(),noneMatch()メソッド

指定された条件に”全て一致”、”いずれか一致”、”どれも一致しない”という場合に
trueを返し、それ以外はfalseを返すメソッドです。
引数にはPredicate型の関数を渡す必要があります。

forEach(),count()メソッド

forEach()メソッドは引数で指定されたConsumer型の関数を各要素にして行います。
count()メソッドは要素の個数をlong値で返します。

reduce()メソッド

元の値と結合的な累積関数を使ってストリームの要素に対しリダクションを実行し、リデュースされた値を返します。

Optionalクラス

概要

OptionalクラスはJava SE 8から追加された、単一の値を保持しているクラスです。
保持している値がnullかそうでないかによって、処理が異なることが特徴です。

get(),ifPresent()メソッド

get()メソッドは、値が存在する場合は値を返し、それ以外の場合は、
NoSuchElementExceptionをスローします。
ifPresent()メソッドは、値が存在する場合はtrue、それ以外はfalseを返します。

findFirst(),FindAny()メソッド

ストリームの最初の要素もしくは、いずれかの要素を返すメソッドです。

中間操作

※中間操作は、終端操作が実行されるまで実行されません。

filter(),distinct()メソッド

filter()メソッドは引数で指定した条件式に合致した要素で構成されたストリーム
を返します。
distinct()メソッドは重複した要素を除いた要素で構成されたストリームを返します。

map(),sorted()メソッド

map()メソッドは引数で指定された処理を適用した結果から構成されるストリームを返します。
sorted()メソッドは引数のComparatorオブジェクトによって要素を並べ替えます。
引数を持たないsorted()メソッドは自然順序に従って並べ替えを行います。

peek()メソッド

peek()メソッドはデバッグ用として用いられます。
引数はConsumerインターフェースであるため、処理を実行しますが、戻り値はありません。
要素がパイプラインを通過する際にその内容を確認することができます。

Collectorsクラス

Collectorsクラスには、Collectorオブジェクトを提供するstaticメソッドが多数あります。
主に、ストリームから要素をまとめて一つのオブジェクトを取得するものとなります。

toList(),joining(),summingInt(),averagingInt()メソッド

toList()メソッドはストリームからListに変換を行います。

joining()メソッドはストリームを単一の文字列に変換します。
引数がある場合はの引数の文字列を要素に挟んで単一の文字列を生成します。

summingInt()メソッドはストリームの合計値の計算を行います。

averagingInt()メソッドはメソッドの平均値の計算を行います。

toSet(),toMap()メソッド

toSet()メソッドはストリームをSetに変換します。

toMap()メソッドはストリームをMapに変換します。
※マップ先のキーが重複する場合は実行時にIllegalStateExceptionがスローされます。

groupingBy()メソッド

groupingBy()メソッドは指定した条件にしたがってグルーピングを行います。
引数のFunctionにマップの要素を渡し、戻り値がキーになるイメージです。

まとめ

JavaGold取得の為に学習を進める中で、StreamAPIの暗記要素が非常に大きかった為、簡易的にではありますが、主要メソッドをまとめてみました。
JavaGoldの実際の問題では、各メソッドの戻り値型を把握していなければどれがコンパイルエラーになるのか、どんな処理をしているのかが理解できず解けない問題が多い印象です。
書籍やAPIリファレンスを見て暗記する!といったやり方よりも、一度概要だけ整理して、自分で何度もコードを書いてみるというのが
理解&暗記につながるのかと思いました。

この記事が少しでもJavaGold学習をしている方の参考になれば幸いです。