はじめに
こんにちは ◤●ㅅ●◥ノ
今回は関数とラムダ式について学びました!
第3章 関数とラムダ式
1.関数オブジェクト
プログラミング言語において、プログラムの実行中に生み出したり、変数に代入したりできるもの
→ 第1級オブジェクト
第1級オブジェクトとは以下に挙げるようなものたちのこと
・データ(数値や文字)
・データ構造(配列や構造体)
・インスタンス
またその3種類以外にも関数が存在する
→第1級オブジェクトとして扱う関数を特に関数オブジェクトと表現する
Java世界における関数とは...
何らかの情報(Input)を引数として受け取り、
何らかの処理(Process)を行い、
何らかの結果(Output)を戻り値として返す、ひとかたまりの処理ロジック
関数とメソッドの違い
1.メソッドはクラスに属する一種の関数である
2.関数にとって名前は重要でなく、必須ではない
2.関数の代入
変数へのメソッド参照の格納
変数名 = クラス名::そのクラスの静的メソッド名
変数名 = インスタンス変数名::そのインスタンスのメソッド名
Function型
java.util.function.Functionインタフェースとして定義されている
→さまざまな種類の関数オブジェクトへの参照を格納することができる
→ジェネリクスでFunctionのように定義されており、
格納する関数の引数をT戻り値をRにそれぞれ実型引数として指定する
すべての関数オブジェクトを代入できるわけではない
→「引数がない関数」「戻り値がない関数」もあるため
java.util.functionパッケージにはfunctonクラス以外にも
様々な関数オブジェクトを格納するインタフェースがいくつか準備されている
→標準関数インタフェース
標準関数インタフェースを用いた代表的な3つのケース
1.戻り値がない関数を格納する
java.utiol.function.Consumerインタフェースを用いる
2.引数がない関数を格納する
java.util.function.Supplierインタフェース
3.複数の引数を受け取る関数を格納する
同じ型の2つの引数に対応するjava.util.function.BiFunctionインタフェース
これまでの標準関数インタフェースだけで全てのケースに対応できない
→オリジナルのインタフェースを定義することができる
関数インタフェースの利用
・抽象メソッド宣言に記述した引数と型が一致する関数オブジェクトを格納できる
・抽象メソッド名で呼び出すことができる
3.ラムダ式
関数オブジェクトを変数に格納できる
→関数本体ではなく、メモリ空間における関数の実体があるアドレスを指し示す参照を格納している
→参照先にある関数の実態が「いつ生成されるのか
メソッドの実体が生まれるタイミング
メソッドとして定義した処理ロジック(関数)の事態は、必要とされる時期に関わらず、
クラスがJVMに読み込まれたとおきに自動的に生成される
プログラム実行中の必要になったタイミングで生み出して即時利用することができる
→ ラムダ式 を用いる
:ラムダ式の構文
(型 引数名1、型 引数名2、...)->{
処理;
:
return 戻り値;
}
ラムダ式の省略記法
1.代入じはラムダ式の引数宣言における型を省略可能
2.ラムダ式の引数が1つの場合は丸カッコを省略可能
3.ラムダ式が単一のreturn文の場合、波カッコとreturnを省略可能
ラムダ式には「自信が評価され関数の実体が生み出される際、
その時点でアクセス可能なすべての変数の情報を記憶し、ラムダ式の中で参照できる」
→クロージャ
4.関数オブジェクトの活用
関数がもたらした「変革」と「利便性」
→これまで、メソッドに対してデータしか渡すことができなかったものが
アルゴリズムを渡せるようになり、より高度な処理を実現できる可能性が広がった
5.StreamAPI
宣言的に処理を行うためのデータの並び...ストリーム(Stream)
java.util.stream.Streamsインタフェースとして扱う
ストリームの生成
・コレクションの場合
Stream<T> st = コレクション<T>.stream
・配列の場合
Stream<T> st = Arrays.stream(T型の配列);
まとめ
Javaでは関数を第1級オブジェクトとして扱える
関数とは「入力、処理、出力を有する処理ロジック」である
ラムダ式を用いることでプログラム実行中の必要になったタイミングで生み出して即時利用することができる
ラムダ式には様々な省略記法があり、簡単な関数であればシンプルに記述できる