Как стать автором
Обновить

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

Время на прочтение1 мин
Количество просмотров20K
Автор оригинала: Esko Luontola

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

Под капотом


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

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

Retrolambda использует Java аgent для поиска байткода, который динамически генерируется LambdaMetafactory, сохранения его как .class-файла и замены инструкций invokedynamic на явную инициализацию этих классов. Библиотека также меняет модификатор видимости некоторых синтетических методов на package, таким образом байткод может получить к ним доступ без использования MethodHandle.
Теги:
Хабы:
Всего голосов 41: ↑39 и ↓2+37
Комментарии12

Публикации

Истории

Работа

Java разработчик
306 вакансий

Ближайшие события