23 июля 2013

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

Java
Перевод
Автор оригинала: Esko Luontola

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

Под капотом


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

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

Retrolambda использует Java аgent для поиска байткода, который динамически генерируется LambdaMetafactory, сохранения его как .class-файла и замены инструкций invokedynamic на явную инициализацию этих классов. Библиотека также меняет модификатор видимости некоторых синтетических методов на package, таким образом байткод может получить к ним доступ без использования MethodHandle.
Теги:javalambdasclosures
Хабы: Java
+37
19,4k 102
Комментарии 12
Похожие публикации
Профессия Java-разработчик
1 декабря 202082 500 ₽SkillFactory
Java QA Engineer
21 декабря 202060 000 ₽OTUS
Java Developer. Professional
22 декабря 202060 000 ₽OTUS
Java Junior Developer
17 февраля 202123 990 ₽Level UP
Лучшие публикации за сутки