11
4

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 5 years have passed since last update.

インタフェースの実装がラムダになるまで

Last updated at Posted at 2016-12-13

#はじめに
この記事はラムダ弱者へのアップグレード記事です。
SE7まででも使える「匿名クラス」と、SE8の機能「ラムダ式」を比較します。

というのも、ラムダ式は「匿名関数」あるいは「無名関数」と呼ばれることもあり、匿名クラスとよく似た概念なのです。1

匿名クラスとラムダ式(匿名関数)の違いはざっくり言うと「クラスかメソッドか」で、匿名のクラスを定義するものが匿名クラス、匿名のメソッドを定義するものがラムダ式(匿名関数)という理解でほとんど問題ないと思います。

#前提

素数判定を行うメソッドを持つインタフェースがあるとする。

Primes.java
public interface Primes {
    boolean isPrime(Integer param);
}

#普通の実装クラス
ふつーにimplementsするとこう。

PrimesImpl.java
public class PrimesImpl implements Primes {

    @Override
    public boolean isPrime(Integer param) {
        for (int i = 2; i < param; i++) {
            if (param % i == 0) {
                return false;
            }
        }
        return true;
    }
}

呼び出し方はこう。ニューする。

Main.java
public class Main {
    public static void main(String[] args) {
        System.out.println(new PrimesImpl().isPrime(7));
    }
}

#匿名クラスによる実装
匿名クラスを使うとこう。

Main.java
public class Main {
    public static void main(String[] args) {
        Primes primesInner = new Primes() {
            @Override public boolean isPrime(Integer param) {
                for (int i = 2; i < param; i++) {
                    if (param % i == 0) {
                        return false;
                    }
                }
                return true;
            }
        };
        System.out.println(primesInner.isPrime(7));
    }
}

中でクラスをニューしながら実装してるからMainクラスONLY。

#ラムダ式による実装
ラムダ式を使うとこう。

Main.java
public class Main {
    public static void main(String[] args) {
        Primes primesLambda = param -> {
            for (int i = 2; i < param; i++) {
                if (param % i == 0) {
                    return false;
                }
            }
            return true;
        };
        System.out.println(primesLambda.isPrime(7));
    }
}

匿名クラスよりちょっと省略されてる。

メソッド名も消える。これはPrimesインタフェースが関数インタフェースの要件を満たしているから。「関数インタフェース=実装すべきメソッドは必ずひとつ」なので、メソッドは自明。

ちなみに、Primesが関数インタフェースでなかったら(実装すべきメソッドがひとつでなかったら)、ラムダ式では複数のメソッド実装ができなくてコンパイルエラー。

引数と戻り値は型推論ががんばる。

#おまけ
ラムダラムダさせるとこう。

Main.java
public class Main {
    public static void main(String[] args) {
        Primes primesFunction = param -> IntStream.range(2, param).noneMatch(i -> (param % i) == 0);
        System.out.println(primesFunction.isPrime(7));
    }
}

メンテできないから書くな!と怒られるやつ。

以上
なにか間違ってたらおしえてください!!!

###参考
きしだのはてな Java8 Lambdaの文法拡張まとめ

  1. 厳密には「ラムダ関数」と「匿名関数」がイコールであり、ラムダ式はラムダ関数の記法のこと。

11
4
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
11
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?