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

Хотите использовать лямбда-выражения, но вынуждены использовать стабильный 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/
Нажмите здесь для печати.