Sind kompilierte Java 8-Lambda-Ausdrücke mit früheren Versionen der Java-Laufzeit abwärtskompatibel?

Um die Unordnung zu verringern, die durch zahlreiche Instanziierungen anonymer Typen verursacht wird, untersuche ich die Möglichkeit, Java 8-Lambdas zu nutzen.

Ein wichtiger Gesichtspunkt vor der Verwendung von Java 8 und Lambdas in einer Produktionsumgebung ist, ob JDK8-kompilierter Code, der Lambda-Ausdrücke verwendet, auf einer früheren Version der Java-Laufzeit ausgeführt werden kann. Ich interessiere mich speziell für JRE6 und JRE7 als Zielplattformen.

Einerseits verstehe ich, dass Lambdas einfach syntaktischer Zucker um eine Instanziierung einer anonymen Klasse sind, die eine Methode enthält. Andererseits bin ich mir nicht sicher, ob diese Äquivalenz impliziert, dass der für jedes Byte generierte Code für andere JVM-Versionen als JRE8 identisch und / oder kompatibel ist.

Beispiel für die Schnittstelle mit nur einer Methode:

public interface Action<T> {
    public void perform(T argument);
}

Die folgenden zwei Ausschnitte sind "funktional" äquivalent:

Mit Lambda:

final Action<String> y = i -> System.out.println(i);

Mit anonymer Klasseninstanz:

final Action<String> y = new Action<String>() {
    @Override
    public void perform(final String i) {
        System.out.println(i);
    }
};

Meine konkrete Frage ist, ob diesemantisch Die Äquivalenz beider Konstrukte erstreckt sich auf die Äquivalenz ihrerzusammengestellte Darstellungen. Wenn sie tatsächlich äquivalent kompiliert werden, bedeutet diese Äquivalenz außerdem, dass die kompilierte Form eines Lambda-Ausdrucks in früheren Versionen der Java-Laufzeit ohne Änderung gehostet werden kann?

Antworten auf die Frage(4)

Ihre Antwort auf die Frage