Java / 基礎 / ラムダ式

Java / 基礎 / ラムダ式

以前もメソッドがインタフェースを引数に取った場合に、その場に直接記述出来るという文法があった。 これにより、メソッドに対して実行時に纏まった処理を後入れするという設計ができるようになっていた。

ラムダ式はそれをもっと簡便にしたもの。

Java / Ope / Collection操作 / Stream において非常に効果的に用いられている。

恒等関数

ラムダを使うにおいて、何もしないで単に右から左へ値を受け渡すだけの土管のようなラムダが欲しくなる場合がある。

その場合にはこのように書く

e -> e

これの省略である

(e) -> {
    return e;
}

これは短く書けるし、わかる人には明確なのでよいのだが、ここにインスタンスが内部的に発生するのでパフォーマンスにやや影響があるっぽい(コンパイラがプリプロセスで最適化しそうな気もせんでもないが)。

なのでこれの代わりにこのメソッドが使える。

Function.identity() 

こいつは内部実装がシングルトンになっていて、インスタンフが内部的に発生しない。

以前のインタフェース方式での処理の後入れ

まずインタフェースを作る

public interface IProc1 {
    public String dododo(String a);
}

このインタフェースをパラメータに取るメソッドを実装する。

public class Fuga {
    public String mumumu(String a, IProc1 p) {
        return p.dododo(a);
    }
}

このメソッドを実行する。

        Fuga f = new Fuga();
        String s = f.mumumu("mumumumumu", new IProc1() {
            @Override
            public String dododo(String a) {
                return a + "gogogogo";
            }
        });
        System.out.println(s);

ケツに gogogogo を連結するという処理を実行時に後入れできている。

ラムダ式で使ってみる

↑の IProc1 のようなメソッドが1個しかないインタフェースを関数型インターフェースと呼ぶ。 関数型インターフェースならばこれにラムダ式を渡すことができるようになる。

記述はこうなる。

Fuga f = new Fuga();
String s = f.mumumu("mumumumumu", (a) -> {
    return a + "gogogogo";
});
System.out.println(s);

パラメータの型から使うインタフェースは自明。メソッドが1個しかないので、対象のメソッドも自明。 なのでそのへんの処理を全部省略して書けるのがラムダ式。

ラムダ式の省略形

この処理はラムダ式が引数が1個しか無いかつ処理が1行しか無い。

Fuga f = new Fuga();
String s = f.mumumu("mumumumumu", (a) -> {
    return a + "gogogogo";
});
System.out.println(s);

なのでこれを省略してこうなる。

Fuga f = new Fuga();
String s = f.mumumu("mumumumumu", a -> a + "gogogogo");
System.out.println(s);

ラムダ式中の this

ラムダ式中の this は外部の this を指す。 なので static なメソッドの中では this は使えないということになる。

java/basic/lambda_expression/start.txt · 最終更新: 2021-02-01 19:51 by ore