大変お世話になっております。
反逆する武士
uematu tubasaです。
初回投稿日時:2023年6月25日(令和5年6月25日)
ラムダ式の基本的な問題
ラムダ式とは、インターフェースの実装を簡略化することで生産性が上昇します。
記述方式:関数型インターフェースの型 変数名 = (引数) -> {処理内容};
もしラムダ式の引数が1つの場合は以下のように「()」を省略することができます。
関数型インターフェースの型 変数名 = 引数 -> {処理内容};
また、{}で処理内容を囲むことが無い場合、ラムダ式の処理内容が1つしか記述できず、何らかの値を戻す場合はreturnを記述できません。
Test t = () -> return "hello!";←コンパイルエラー。
上記のラムダ式を説明すると、引数はなし、hello!という文字列を返却するという処理内容ですが、returnを記述してしまっているので、コンパイルエラーになります。
一方で、{}で処理内容を囲む場合、ラムダ式の処理内容を複数記述することができ、戻り値を戻すにはreturnを記述しなければなりません。
関数型インターフェースなので、独立しないといけない問題
以下のプログラムをコンパイル、実行したときの結果は何か。
public class Main {
public static void main(String[] args){
String val = "A";
Function f = (val) -> {
System.out.println(val);
};
f.test("B");
}
}
interface Function {
void test(String val);
}
【回答】コンパイルエラーになる。
【解説】ラムダ式を宣言しているブロックで宣言したローカル変数と同じ名前の変数はラムダ式内で宣言できません。
ラムダ式は1つの独立した処理ですので、他から影響を受けるような記述はできません。
ラムダ式外部で宣言した変数を利用することはできません。
ラムダ式の4大処理:Predicate<T>
関数型インターフェースPredicate<T>は引数を引き取ってそれを評価するラムダ式になります。
使用するメソッドはtestです。
Booleanを返却します。
String str = "Lamda";
Predicate predicate = p -> "Lamda".equals(p);
if (predicate.test(str)) {
System.out.println("Predicateは任意の型の引数を元にしてBooleanを返却");
}
ラムダ式の4大処理:Consumer<T>
関数型インターフェースConsumer<T>は引数を受け取って処理をする値を戻すことはない。
使用するメソッドはvoid accept(T)です。
引数を消費するだけの処理と覚えましょう。
※消費者物価指数のCはConsumerです。経済知識が役に立つとは。
Long valueLong = 10L;
Consumer con = val -> {
System.out.println("引数の値:" + val + " Consumerは任意の型の引数を利用するだけ");
};
con.accept(valueLong);
ラムダ式の4大処理:Supplier<T>
関数型インターフェースSupplierは引数を何も受け取らず結果だけを返す。
使用するメソッドはget
値を戻し、供給するだけの処理と覚えましょう。
Supplier<Integer> s = () -> 500 * 12;
int valueInt = s.get();
ラムダ式の4大処理:Function<T,R>
関数型インターフェースFunction<T,R>は引数を受け取って指定された型(R)の結果を戻す処理。
使用するメソッドはapply。
Function<String, Integer> f = bingo -> {
int intBingo = 0;
if(bingo != null && bingo.isEmpty()) {
intBingo = Integer.parseInt(bingo);
}
return intBingo;
};
if(f.apply("600") > 500) {
System.out.println("FunctionはTの型の値を受け取ってRの型で返す");
}
以上です。