Java 8にlambda expressionが導入され、ボイラープレートコードの削減に役立ちます。インターフェイスにメソッドが1つしかない場合は正常に動作します。複数のメソッドで構成される場合、どのメソッドも機能しません。複数のメソッドを処理するにはどうすればよいですか?
次の例に行くかもしれません
public interface I1()
{
void show1();
void show2();
}
では、メイン自体のメソッドを定義するメイン関数の構造はどうなるでしょうか。
ラムダ式はEranが言ったように機能的なインターフェースでのみ使用できますが、インターフェース内で複数のメソッドが本当に必要な場合は、修飾子をdefault
またはstatic
に変更し、実装するクラス内でそれらをオーバーライドできます。必要に応じて。
public class Test {
public static void main(String[] args) {
I1 i1 = () -> System.out.println(); // NOT LEGAL
I2 i2 = () -> System.out.println(); // TOTALLY LEGAL
I3 i3 = () -> System.out.println(); // TOTALLY LEGAL
}
}
interface I1 {
void show1();
void show2();
}
interface I2 {
void show1();
default void show2() {}
}
interface I3 {
void show1();
static void show2 () {}
}
継承されたメソッドを忘れないでください。
ここで、I2
はshow1
とshow2
を継承するため、機能的なインターフェースにすることはできません。
public class Test {
public static void main(String[] args) {
I1 i1 = () -> System.out.println(); // NOT LEGAL BUT WE SAW IT EARLIER
I2 i2 = () -> System.out.println(); // NOT LEGAL
}
}
interface I1 {
void show1();
void show2();
}
interface I2 extends I1 {
void show3();
}
インターフェースが機能的なインターフェースであることを確認するには、次の注釈を追加します@FunctionalInterface
@FunctionalInterface <------- COMPILATION ERROR : Invalid '@FunctionalInterface' annotation; I1 is not a functional interface
interface I1 {
void show1();
void show2();
}
@FunctionalInterface
interface I2 {
void show3();
}
ラムダ式は、単一の抽象メソッドを持つインターフェースである機能インターフェースの実装にのみ使用できます。 2つの抽象メソッドを持つインターフェースは、ラムダ式では実装できません。
私は通常、インターフェースで静的ファクトリーメソッドを直接作成します。
public inteface I1 {
void show1();
void show2();
public static I1 of(Runnable show1, Runnable show2) {
return new I1() {
void show1() { show1.run(); }
void show2() { show2.run(); }
};
}
}
使用法:
I1 i1 = I1.of(() -> System.out.println("show1"), () -> System.out.println("show2"));
いつでもコンポジションを使用できます:
public inteface I1 {
void show1();
void show2();
}
public class I1Adapter {
private final Runnable r1,r2;
public I1Adapter(Runnable r1, Runnable r2) {this.r1=r1; this.r2=r2;}
public void show1() {r1.run();}
public void show2() {r2.run();}
public static I1Adapter compose(Runnable r1, Runnable r2) {
return new I1Adapter(r1,r2);
}
}
あなたはできません(静的インポートで):
I1 i1 = compose(()->foo(), ()->bar());