- PVSM.RU - https://www.pvsm.ru -

Лямбда-выражения бэкпортированы в Java 7, 6 и 5

Лямбда выражения бэкпортированы в Java 7, 6 и 5
Хотите использовать лямбда-выражения, но вынуждены использовать стабильный JRE? Теперь это возможно с утилитой Retrolambda [1], которая преобразует байткод Java 8 в пригодный для рантаймов Java 7, 6 и 5, позволяя использовать лямбда-выражения [2] и ссылки на методы [3] на этих платформах. Конечно, придется отказаться от улучшенного Java 8 Collections API, но, к счастью, существует множество [4] альтернативных [5] библиотек [6], работа с которыми упростится благодаря лямбда-выражениям.

Под капотом

Пару дней назад в кафе мне в голову пришла идея поискать [7] кого-нибудь, кто уже занимался этой проблемой, но после пары разговоров со стенкой [8], сделал все самостоятельно за выходные.

Изначальный план тупого копирования классов из OpenJDK провалился (LambdaMetafactory [9] зависит от некоторых приватных классов и требовала модификации), но в конечном итоге я нашел путь избежать лишний зависимостей от рантайма.

Retrolambda использует Java аgent [10] для поиска байткода, который динамически генерируется LambdaMetafactory, сохранения его как .class-файла и замены инструкций invokedynamic на явную инициализацию этих классов. Библиотека также меняет модификатор видимости некоторых синтетических методов на package, таким образом байткод может получить к ним доступ без использования MethodHandle [11].

Автор: Lucyfer

Источник [12]


Сайт-источник PVSM.RU: https://www.pvsm.ru

Путь до страницы источника: https://www.pvsm.ru/java/39345

Ссылки в тексте:

[1] Retrolambda: https://github.com/orfjackal/retrolambda

[2] лямбда-выражения: http://docs.oracle.com/javase/tutorial/java/javaOO/lambdaexpressions.html

[3] ссылки на методы: http://docs.oracle.com/javase/tutorial/java/javaOO/methodreferences.html

[4] множество: https://code.google.com/p/guava-libraries/

[5] альтернативных: https://code.google.com/p/totallylazy/

[6] библиотек: http://functionaljava.org/

[7] поискать: http://eng.wealthfront.com/2013/04/i-can-haz-lambda-on-java-7.html

[8] разговоров со стенкой: http://stackoverflow.com/questions/17756604/has-anybody-yet-backported-lambda-expressions-to-java-7

[9] LambdaMetafactory: http://download.java.net/jdk8/docs/api/java/lang/invoke/LambdaMetafactory.html

[10] Java аgent: http://docs.oracle.com/javase/7/docs/api/java/lang/instrument/package-summary.html

[11] MethodHandle: http://docs.oracle.com/javase/7/docs/api/java/lang/invoke/MethodHandle.html

[12] Источник: http://habrahabr.ru/post/187596/