#はじめに
この記事はラムダ弱者へのアップグレード記事です。
SE7まででも使える「匿名クラス」と、SE8の機能「ラムダ式」を比較します。
というのも、ラムダ式は「匿名関数」あるいは「無名関数」と呼ばれることもあり、匿名クラスとよく似た概念なのです。1
匿名クラスとラムダ式(匿名関数)の違いはざっくり言うと「クラスかメソッドか」で、匿名のクラスを定義するものが匿名クラス、匿名のメソッドを定義するものがラムダ式(匿名関数)という理解でほとんど問題ないと思います。
#前提
素数判定を行うメソッドを持つインタフェースがあるとする。
public interface Primes {
boolean isPrime(Integer param);
}
#普通の実装クラス
ふつーにimplementsするとこう。
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;
}
}
呼び出し方はこう。ニューする。
public class Main {
public static void main(String[] args) {
System.out.println(new PrimesImpl().isPrime(7));
}
}
#匿名クラスによる実装
匿名クラスを使うとこう。
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。
#ラムダ式による実装
ラムダ式を使うとこう。
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が関数インタフェースでなかったら(実装すべきメソッドがひとつでなかったら)、ラムダ式では複数のメソッド実装ができなくてコンパイルエラー。
引数と戻り値は型推論ががんばる。
#おまけ
ラムダラムダさせるとこう。
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の文法拡張まとめ
-
厳密には「ラムダ関数」と「匿名関数」がイコールであり、ラムダ式はラムダ関数の記法のこと。 ↩