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

в 16:24, , рубрики: closures, java

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

Под капотом

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

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

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

Автор: Lucyfer

Источник

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js