Чтобы уменьшить беспорядок, вызванный многочисленными экземплярами анонимных типов, я изучаю возможность использования Java 8 lambdas.
Важное соображение перед использованием Java 8 и lambdas в производственной среде заключается в том, может ли исполняемый код JDK8, который использует лямбда-выражения, выполнять в более ранней версии среды выполнения Java. Меня особенно интересуют JRE6 и JRE7 как целевые платформы.
Одна рука, я понимаю, что лямбды - это просто синтаксический сахар вокруг создания анонимного класса, содержащего один метод. С другой стороны, я не уверен, что эта эквивалентность подразумевает, что байт-код, сгенерированный для каждого, идентичен и/или совместим в версиях JVM, отличных от JRE8.
Например, с учетом интерфейса одного метода:
public interface Action<T> {
public void perform(T argument);
}
Следующие два фрагмента являются "функционально" эквивалентными:
С лямбдой:
final Action<String> y = i -> System.out.println(i);
С анонимным экземпляром класса:
final Action<String> y = new Action<String>() {
@Override
public void perform(final String i) {
System.out.println(i);
}
};
Мой конкретный вопрос заключается в том, распространяется ли семантическая эквивалентность обеих конструкций на эквивалентность их скомпилированных представлений. Более того, если они действительно компилируются эквивалентно, означает ли эта эквивалентность, что скомпилированная форма выражения лямбда может быть размещена в более ранних версиях среды выполнения Java без изменений?