###目的
現在、Java Silverの取得に向けて勉強中です。関数型インターフェイス、ラムダ式関係の問題の理解に苦しんだので重要ポイントをまとめました。本記事が同じような目標を持った方に少しでも役にたったら幸いです。
###ラムダ式とは
関数型インターフェース:実装が必要なメソッドを一つだけもつインターフェースのこと。
public interface calcSum{
public abstract int sum(int num1, int num2);
}
ラムダ式:関数型インターフェースを実装する際に使われる式のこと。
通常、上記のCalcSumインターフェイスを実装し、利用する場合、以下のようにインターフェイスを実装し、実装したクラスをインスタンス化して利用します。
//実行用クラス
public static void main(String []args){
calcSumImpl sum = new calcSumImpl();
int answer = sum.calcSum(5,4);
System.out.println(answer);
}
//インターフェイスを実装したクラス
class calcSumImpl implements CalcSum{
@Override
public int calcSum(int num1,int num2){
return num1 * num2;
}
}
上記をラムダ式を使用して実装すると以下のようになります。メソッドは一つしかないので、メソッド名を省略できます。また、インスタンス化する処理も省略され、記述しているのは引数と{}内の実装部分だけです。
public static void main(String []args){
CalcSum calcSum = (int num1, int num2) -> {
return num1 + num2;
};
int answer = calcSum.calcSum(5,4);
System.out.println(answer);
}
ラムダ式の基本構文は以下の通りです。
//構文
(引数) -> {};
###注意点①(記述の省略)
また、以下のように引数の型や{}、returnの記述を省略することができます。
//引数の型を省略
CalcSum calcSum = (num1,num2) -> {
return num1 + num2;
};
//{}やreturnを省略(処理が一行のみの場合)
CalcSum calcSum = (num1,num2) -> return num1 + num2;
ただし、{}とreturnの省略、記述には以下の条件があります。
・ラムダ式で{}を省略した場合には、returnを記述できない。また、処理は1文のみ。
・ラムダ式で{}を記述した場合には、reutrnを省略できない。また、処理は複数行でも可。
###注意点②(変数のスコープ)
ラムダ式は、それを囲むボブロックと同じスコープをもつ。よって、ラムダ式を宣言しているブロックで宣言したローカル変数と同じ名前の変数はラムダ式内では宣言できません。また、ラムダ式外で宣言されたローカル変数にラムダ式内からアクセスするには実質的にfinalな変数でなければなりません。
そのため、以下のようにラムダ式内外で変数の値を変更しようとするとコンパイルエラーとなります。
interface Function {
void test();
}
public class Test {
public static void main(String[] args) {
String val = "hello";
Function f = () -> {
//val = "hello!hello!" //コンパイルエラー
System.out.println(val);
};
//val = "GoodMorning!" //コンパイルエラー
f.test(); //hello
}
}
###関数型インターフェース
関数型インターフェイスはプログラマが自由に定義できるが、頻繁に使われるであろうものについては、java.util.finctionパッケージとして追加されました。Java Silverでは以下に示す4つが試験でよく出題されます。
関数型インターフェイス | メソッド | 説明 |
---|---|---|
Consumer | void accept(T) | 引数を受け取って処理をする。結果を戻さない、引数の消費者。 |
Supplier | T get() | 何も受け取らずに結果だけを戻す供給者 |
Predicate | boolean test(T) | 引数を受け取ってそれを評価する「断定」 |
Function | R apply(T) | 引数を受け取って、指定された型(R)の結果を戻す「処理」 |