当サイトは、アフィリエイト広告を利用しています

【java8】streamAPIの使い方まとめ

作成日:2023月12月09日
更新日:2023年12月09日

当ブログではjava8のstreamAPIを使ったListや配列の操作方法に
関する記事をいくつか紹介している

自分でも仕事やプライベートで実装中に
使い方を忘れて調べにいくことがあり、
ネット検索で自分の記事を見つけて

「そういえば、書いてたな」

ってなることが少なくない。

ということで、java8のstreamAPIのまとめを作ることにした

streamAPIとは?

Java8のStreamAPIは、コレクションや配列などの要素を操作するための
機能的なプログラミングスタイルを提供するJavaの機能のこと。

今までは二重ループなどで処理していたことを
一発で書けるようになる。
※書き方が特殊なので最初は読みづらいが慣れると使いやすい!

streamAPIによる処理は

  • stream生成処理
  • 中間処理
  • 終端処理

に分類できる

stream生成処理

中間処理を行うためにstreamを生成する処理のこと

中間処理

中間処理ではStreamパイプラインで要素に対する変換やフィルタリングなどの操作を行う。
中間処理は他の中間処理にチェーンすることができる。
中間処理は実際の処理結果は得られず、処理結果を得るいは終端処理を
行う必要がある。

終端処理

終端処理は、Streamパイプラインの最後に適用され、実際に処理を実行して結果を生成する。
中間処理で加工した採取結果を終端処理で取り出す。
※中間処理なしで終端処理を書くこともできる。

streamAPIのメソッド別に当ブログで紹介している記事を
まとめていく。

streamAPIを使った処理

下記のメソッドをまとめる

stream生成処理

  • concat

中間処理

  • filter
  • map
  • sorted
  • flatMap
  • distinct

終端処理

  • forEach
  • findfirst
  • findAny
  • match(anyMatch,allMatch,noneMatch)
  • reduce
  • toMap
  • groupingby
  • partitioningby
  • joining
  • collect

concat

2つのストリームを結合して1つの新しいストリームを作成する
最初のストリームの要素が続いた後に、2番目のストリームの要素が続くように
要素を連結する

用途

用途としては、二つのlistを結合する時などに使う。
この時、オブジェクトのListの場合は格納されている
オブジェクトの方が同じである必要がある。

concat記事

filter

filterはListや配列の中から、指定した条件に一致する
要素のみを抽出する

多分、streamAPIの中で、使用率はかなり高い。
自分でもよく使う

用途

用途も幅に飛んでいて

  • Listから必要な要素のみを抽出する
  • Listから重複を省く
  • Listから重複している要素のみを抽出する

などfilterの機能を使って色々なことができる

またmapとチェーンして使うことで、filterで
特定の要素を抽出して、編集を行うこともできるので
filter単体ではなく、他のメソッドと合わせて使うことで
さらに用途は広がる

filter記事

下記記事でfilterの使い方に関して
詳しく紹介してます

listから重複している要素のみを抽出する

2つのListのつき合わせで使用

map

mapメソッドは配列またはlistの各要素に対して 指定した処理を実行できる中間操作メソッド

filterと組み合わせて使うことも多い

用途

オブジェクトのlistから特定の属性のみのlistを作ることや
オブジェクトのlistから別オブジェクトのlistを作成するなど
使いどころは多い。

map記事

mapの使い方

2つのListのつき合わせで使用

sorted

sortedメソッドは、ストリーム内の要素を昇順/降順/任意の順に並び替えること
できる

用途

sortedで並べ替えて、findfistで最初の値を取得する当なとで
最小値や最大値を取得することができる。

filterやfindfirstと一緒に使うことが多い。

sorted記事

sortedの使い方

filterとfindfirstとは組み合わせ

flatMap

1つの要素を複数の要素に変換し
それらを1つのフラットなストリームにマッピングする

用途

flatMapはList< List < String > >などのネストされたリストを
List < String >のようにフラットなリストに変換して処理したい時などに
使用する。

flatMap記事

List結合でflatMapを使用

Listの突合せ処理で使用

distinct

distinctは配列に対して、重複を省くことができる。
注意点としては、対象が配列になるので
オブジェクトのListの重複チェック等をしたい場合は
distinctではなく、filterを使うようにする

用途

用途は主に配列の重複チェックになる。
個人的にはfilterを使うことが多いので
あまり使わないかな。

distinct記事

下記記事でdistinctの使い方に関して
詳しく紹介してます

配列から重複している要素を省く

forEach

forEachはStream内の各要素に対して特定の処理(引数として渡されたラムダ式やメソッド参照など)
を実行する
処理の結果として新しい値やコレクションを生成するのではなく
単に各要素に対してアクションを実行するのみになる

用途

forEachはfor文と違い、forEach内での変数宣言や変数変更ができないので
用途としては、他のstreamAPIと組わせるときに使うことが多い。

for文とforEachのどちらを使うかは適宜、判断していく必要がある。

forEach記事

下記記事でforEachの使い方に関して
紹介してます

forEachを使っている記事

findfirst

findFirstメソッドはStreamの終端処理であり、値を探すメソッドではなく 探した結果の最初の値を返却するメソッド。

用途

filterと一緒に使うことが多い。
filterではListから指定の条件で検索した結果の最初の要素を取得した場合
などに使用する

注意点としてはfindfistは結果をOptional型で返すため
取り出す処理が必要になる

findfirst記事

下記記事でfindfirstの使い方に関して
紹介してます

findfirstの使い方

Optionalの記事

findfirstを使うにはOptional型の扱い方を知る必要がある

2つのListのつき合わせで使用

findAny

findAnyはfindfirstと同じ動作だが、並列処理させた時の動作が異なり
同じ要素を返すとは限らない。

用途

なんでもいいから一つ値がとりたい時に使う
動きがややこしいので、基本的にはfindfirstを使うので
個人的にはあまり使わないかな

findAny記事

下記記事でfindAnyの使い方に関して
紹介してます

findAnyの記事

match(anyMatch,allMatch,noneMatch)

matchメソッドはStreamの終端処理で探しているオブジェクトがStreamにしたListに存在するかとうかを チェックして結果をboolean型で返却する。 Stream内にあるかないかをbooleanで返却する

用途

存在チェックに使う
存在チェックを利用して2つのListの突合せ処理も行うことが
できる

match記事

matchの使い方

2つのListの突合せ処理で使う

reduce

reduceメソッドはストリームの要素を結合して
単一の結果を生成するために使用する

用途

用途としてはList内の要素を集計するなどの処理に使うことが多い。

reduce記事

reduceの使い方

toMap

toMapは終端処理で中間処理の結果をMapの形に変換して値を返す

用途

filterやmapでListや配列に対して、処理を行った結果を
Map型でして取得したい場合に使う

toMap記事

下記記事でtoMapの使い方に関して
紹介してます

groupingby

Collectors.groupingByを使うと配列やListをグルーピングし、
Map<K,List< T >>のMap型データを取得できる
※Kは集約キー、Tは集約対象のオブジェクト。

用途

用途としてはオブジェクトのListに対してある項目で
グルーピングしたい時に使う

SQLのGROUP BYをListや配列に対して実行できるイメージ

groupingby記事

下記記事でgroupingbyの使い方に関して
詳しく紹介してます

partitioningby

Collectors.groupingByを使うと指定した条件にしたがって配列やListを
2つに分割してMap<boolean,List< T >>のMap型データを取得できる
※Tは分割対象のオブジェクト。

用途

用途としてはオブジェクトのListに対してある項目で
2つに分けたい時に使う
groupingbyと違って、2つにしか分けれないので
細かく分けたい場合は、groupingbyを使う

partitioningby記事

下記記事でpartitioningbyの使い方に関して
詳しく紹介してます

joining

文字列のストリームを結合して1つの文字列にまとめるための便利なメソッド

用途

Listの値を区切り文字で一つの文字列にする時などに使用
mapやfilterと組み合わせることで、オブジェクトのListに対して
特定の条件で抽出(filter)してから、特定の属性のみを抽出(map)して、
文字列結合(joininig)させるなどもできる

joining記事

collect

collectは終端処理で、中間処理した結果を最終的に取得する場合に
使う。

toMapやtoListの処理を独自にカスタマイズできるイメージ

用途

用途としては、通常のtoListやtoMapではなく、さらにカスタマイズして
中間処理の結果を取り出したい場合に使う。
※だいたいはtoListやtoMapで事足りるので使う頻度は少ない。

collect記事

新着記事

目次
タグ別一覧
top