この記事について
OracleJavaSE11 goldを勉強していた時になかなか覚えられないな〜っとなっていた内容を毎回見ることができるようにこちらの書籍で勉強していた時のまとめたものです!
おすすめ書籍(勉強開始時点の書籍最新版を購入しましょう)
各カテゴリごとでまとめていますので隙間時間に見てみてください。
ラムダ式
クラスに内包されていない変数に格納できる関数のこと、関数型プログラミングの概念が採用されている。
外部のオブジェクト変数を使用する場合、参照先は実質的にfinalになる。
変数に型がついていないのはvar型で表現されているため。
匿名クラスをさらに簡潔にしたもの(オーバライドするメソッドがわかればいいみたいな)
引数の型は省略可能
(x) -> x;
()も省略可能
x -> x ;
引数の型を記述する場合、()は省略できない
(String x) -> x ;
引数が複数になる場合、引数の型は省略可能だが()は省略できない
(x,y) -> x + y;
{}とreturnのどちらかがあってどちらかがない、というのはダメ
匿名クラス
インスタンス化時に関数型インタフェースをオーバーライドする等
Test A = new Test() { system.out.print("あ") };
メソッド参照
引数と戻り値が確定しているため、それを省いた書き方、変数に格納する
(クラス名::メソッド名)
(インスタンス名::メソッド名)
() -> Math.random()
Math::random
関数型インタフェース
関数型インタフェースとは、抽象型メソッドをひとつだけ持っているもの(default,staticメソッドはあってもよい)
@ functionInterfaceをつけると関数型インタフェースであることをコンパイラに教えられる
43個もあるが基本の7つを派生したものが多い
関数型インタフェース一覧
※functionパッケージ T-引数、R-戻り値
※プリミティブは基本扱えないので注意
Supplier-T get()
何も受け取らず処理結果を返す。
Consumer-void accept(T)
BiConsumer-void accept(T,U)
引数を受け取って処理をする。戻り値なし。
Predicate-boolean test(T)
BiPredicate-boolean test(T,U)
断定すると言う意味。引数(T)を受け取って評価する。
orメソッド(||),andメソッド(&&)がデフォルトメソッドとしてある、複数のPredicateを合成するためのもの。
Function-R apply(T)
BiFunction-R apply(T,U)
引数(T,U)を受け取って指定された型(R)の結果を返す。
andthenメソッドとcomposeメソッドがありひとつの処理として表現できる。
a.andthen(b)ではaが先に処理、a.compose(b)ならbが先に処理され引数の変更は継続される
UnalyOperator-T apply(T)
BinalyOperator-T apply(T,T)
単項演算子という意味。ひとつの値(T)を処理して同じ型(T)の結果を戻す、全て同じ型でなければならない
langパッケージ
Rannable-void run()
スレッド実行処理の記述、thread()
匿名クラスで渡すとオーバーライド可能
戻り値がない
util.cocurentパッケージ
Callable-R call()
スレッド実行と処理結果を返す、例外スロー
プリミティブな値を扱う場合
ToDoubleFunction
戻り値を戻す
LongConsumer
戻さない
ストリーム
配列やコレクション(list,set)のデータ処理をラムダ式で表現できる方法
記述内容
最終的な結果 = ストリームオブジェクト.中間操作メソッド….終端操作メソッド
※終端操作が呼ばれた時に中間操作が呼ばれ、ストリームオブジェクトはクローズする
中間操作メソッド一覧
中間メソッドはストリームを返す
メソッド | 説明 |
---|---|
of() | ストリームの生成 |
distinct() | 要素の重複を取り除く |
filter() | 条件に一致するデータだけ |
limit() | 指定した数まで |
map() | 各データを変換し新しいストリームを生成 |
peek() | 中間結果を取得 |
skip() | 指定した数最初の要素を飛ばす |
sorted() | 自然順序でソート |
flatToMapInt() | 複数の1次元配列をint型ストリームの配列に合算変換 |
終端操作メソッド一覧
メソッド | 説明 |
---|---|
allmatch() | 全ての要素が一致するかboolean |
anymatch() | いずれかの要素が一致するかboolean |
collect() | コレクションを返す |
count() | 要素数を返す |
findAny() | 要素が残っているかランダムの要素をOptionalで返す |
findFirst() | 最初の要素のOptionalを返す |
forEach() | 繰り返し処理 |
max() | 最大の要素を返す |
min() | 最小の要素を返す |
noneMatch() | 条件に一致しないか |
reduce() | 累積結合、リストをひとつにまとめる。optionalが戻り値になる。第一引数があればその型が戻り値。 |
toArray(); | 配列を返す |
Arrays.stream()
配列からストリームを作る
ストリームオブジェクト一覧
Streamインタフェース
T型のデータ参照集合
MapToXXX()
プリミティブに変換する
IntStreamインタフェース
int型
average()
数値の平均を求めて、OptionalDouble型を返す
LongStreamインタフェース
long型
DoubleStreamインタフェース
double型
OptionalDoubleクラス
getAsDouble()
結果の値をdouble型で返す
並列ストリーム
parallelStream()
複数のスレッドで一斉にストリームを処理
forEachOrdered()
ストリームの処理順を保証するがパフォーマンスは向上しない
Collecterインタフェース
Collecter
ストリーム内の要素の型、処理途中の値保持オブジェクト、最終的な結果の型を引数に持つインタフェース
※下記を実装しなければならない※
※ほとんどFunction
supplier()
処理途中のオブジェクトを生成する
supplierラムダを返す
accumulator()
実行したい処理を記述したBiConsumer型のラムダ式を返す
combiner()
BinaryOperaterで受け取り並列ストリームの内容を結合しT型を返す
finisher()
処理結果をもどすR型で返す
Set characteristics()
CollecterのEnumセットを戻す。
CONCURRENT
並行処理をする
IDENTITY_FINISH
finisher()省略可能
UNORDERED
順序の維持を保証しない
指定しないなら
EnumSet.noneOf(Characteristics.class)
averageDouble()
ストリームの要素をdouble型に変換し平均を求めることができる
Collectorsクラス
リストを蓄積したり独自処理を入れるもの。
collectorインタフェースの実現クラス
使用例:ストリーム結果をリストにする
.collect(Collectors.toList())
メソッド名 | 説明 |
---|---|
toList() | 新しいlistを返す |
toSet() | 新しいsetを返す |
toMap() | 新しいmapを返す、第一引数と第二引数がfunctionラムダ |
groupingBy() | 指定した要素でグルーピングしてマップを返す(キーが戻り値、バリューがリスト)。第一引数でfunctionラムダを受けとる |
summingInt() | グルーピングして合算intを返す |
summingLong() | グルーピングして合算longを返す |
summingDouble() | グルーピングして合算doubleを返す |
partitioningBy() | 条件ごとにtrueかfalseでグルーピングしてマップを返す(キーがtrueかfalse、バリューがリスト) |