Ihr Code kann tatsächlich dazu simplfied werden:
private static interface A {
void apply(String name, int i, int j);
}
private final A method_A = this::methodOne;
private final A method_B = this::methodTwo;
public void methodOne(String name, int i, int j){
// do something
}
public void methodTwo(String name, int i, int j){
// do some other thing
}
Die beiden Variablen method_A
und method_B
sind ganz normale Variablen, die vom Typ sind A
. Das Besondere daran ist der Wert, den Sie den Variablen zuweisen - this::methodOne
.
Ich nehme an, Sie haben etwas Wissen über Klassen und Schnittstellen und wie ihre Instanzen funktionieren. Wenn nicht, lerne diese Dinge zuerst.
A
hat nur eine Methode, so dass Sie sie wie einen Typ behandeln können, der eine Methode "speichert". Ich werde erklären warum.
Vor Java 8, würden Sie so etwas schreiben:
private final A method_A = new A() {
@Override
public void apply(String name, int i, int j) {
EnclosingClass.this.methodOne(name, i, j);
}
};
Sie eine anonyme Klasse erstellen, die nur die apply
Methode hat. Sehen? Ist das Objekt method_A
nichts als eine Implementierung einer Methode?
Da Java 8, können Sie stattdessen schreiben diese Lambda-Ausdruck:
private final A method_A = this::methodOne;
Wie Sie jetzt vielleicht denken kann, es ist alles syntaktischer Zucker. Sie sagen im Grunde, dass method_A
methdOne
speichern wird. Sie können dann method_A
umgehen und Sie übergeben tatsächlich die Implementierung einer Methode!
Der neue Stream-API nutzt dies und lässt Sie tun Dinge wie:
someList.stream().forEach(System.out::println);
Vielen Dank für die Erklärung. Die Verknüpfung ist interessant! – theeminence
@theeminance Wenn Sie der Meinung sind, dass eine Antwort Ihre Frage beantwortet, können Sie sie durch Klicken auf das Häkchen akzeptieren. – Sweeper
Ich habe deine Antwort angenommen – theeminence