2
Help us understand the problem. What are the problem?

More than 1 year has passed since last update.

posted at

updated at

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

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

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;

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

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

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Sign upLogin
2
Help us understand the problem. What are the problem?