Pull to refresh

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

Reading time 1 min
Views 20K
Original author: Esko Luontola

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

Под капотом


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

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

Retrolambda использует Java аgent для поиска байткода, который динамически генерируется LambdaMetafactory, сохранения его как .class-файла и замены инструкций invokedynamic на явную инициализацию этих классов. Библиотека также меняет модификатор видимости некоторых синтетических методов на package, таким образом байткод может получить к ним доступ без использования MethodHandle.
Tags:
Hubs:
+37
Comments 12
Comments Comments 12

Articles