1
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

javaのラムダ式について理解する[入門]

Last updated at Posted at 2020-11-18

普段から何気なくラムダ 式記法を使って実装をしていますが、ラムダとはそもそも、どういう仕組みになっているのか改めて調べてみました〜。

Javaのラムダ式とは

Javaのラムダ式とは、ざっくり言ってしまうと、メソッドが1つしかないインターフェイスを簡単に実装するための記法です。

色々記述を省略した結果として、ラムダ記法が生まれているので、
本来、ラムダ式を使わずに書くとしたらどうなるのか?というところから説明を始めます。

サンプル1

CalculatorInterface.java
public interface CalculatorInterface {
    public int calculate(int a, int b);
}
MultiplyCalculator.java
public class MultiplyCalculator implements CalculatorInterface {
    @Override
    public int calculate(int a, int b) {
        return a * b;
    }
}
Main.java
public class Main {
    public static void main(String[] args) {
        CalculatorInterface multiplyCalculator = new MultiplyCalculator();

        int result = multiplyCalculator.calculate(2, 5);

        System.out.println(result); // 10が表示
    }
}

掛け算を行うメソッドを持つMultiplyCalculatorクラスがCalculatorInterfaceを実装する形です。これは基本的な形ですね!!

ただ、実はわざわざMultiplyCalculatorクラスを作らずに実装する方法があります。

それが次のサンプル2です。

サンプル2

CalculatorInterface.java
package sample2;

public interface CalculatorInterface {
    public int calculate(int a, int b);
}
Main.java
package sample2;

public class Main {
    public static void main(String[] args) {
        CalculatorInterface multiplyCalculator = new CalculatorInterface() {
            @Override
            public int calculate(int a, int b) {
                return a * b;
            }
        };

        int result = multiplyCalculator.calculate(2, 5);

        System.out.println(result); // 10が表示
    }
}

MultiplyCalculatorクラスを作らず、mainメソッド内で上記のように書くことで実装できます。

CalculatorInterface multiplyCalculator = new CalculatorInterface() {
     @Override
     public int calculate(int a, int b) {
         return a * b;
     }
};

この部分ですが、これはCalculatorInterfaceをimplementsする無名クラス(名前を持たないクラス)を生成し、その場でメソッドの実装を行っている形となります。

でも、実はもっと簡単に書けるんです、、!それが次のサンプル3になります。

サンプル3

CalculatorInterface.java
package sample3;

public interface CalculatorInterface {
    public int calculate(int a, int b);
}
Main.java
package sample3;


public class Main {
    public static void main(String[] args) {
        CalculatorInterface multiplyCalculator = (a, b) -> {return a * b;};

        int result = multiplyCalculator.calculate(2, 5);

        // returnだけなら、{}も省略できます
        CalculatorInterface multiplyCalculator2 = (a, b) -> a * b;

        int result2 = multiplyCalculator2.calculate(3, 4);

        System.out.println(result); // 10が表示
        System.out.println(result2); // 12が表示
    }
}

もっとすっきりしましたね!CalculatorInterfaceはメソッドが1つしかないので、どのメソッドをオーバーライドするのかが明白です。そんな場合、下記のような形で簡単にメソッドの実装内容を記述することができます。

CalculatorInterface multiplyCalculator2 = (a, b) -> a * b;

これがいわゆるラムダ式というやつです。こんな感じで、記法の省略を重ねるとラムダ式に達するんですね〜!

説明はこれで終わりです。
分かりにくいところあればコメントください〜

1
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?