Кстати, было бы интересно узнать о деталях реализации из «первых рук». Может, напишете статью по этому поводу? Думаю, не только мне хотелось бы с этим разобраться на более глубоком уровне.
Интересное замечание. Формально вы, разумеется, правы. Вот только сути это не меняет: класс всё равно создаётся. Пусть его нельзя назвать «анонимным классом» в терминологии Java, но, тем не менее, это анонимный класс, в смысле отсутствия у него имени.
В Java реализовывать интерфейс может только класс. И лямбды сведены именно к классам. Новой языковой сущности для лямбд в Java не предусмотрено. Они введены именно как синтаксический сахар. Видимо, для лучшей обратной совместимости.
Семантически, лямбда — это именно анонимный класс, и обращаться с ней нужно соответственно. Другое дело — как это реализовано. Да, компилятор генерирует invokedynamic для лямбда-функций. А создавать ли анонимный класс JRE решает уже во время исполнения.
Если нужно явно привести лямбду к функциональному интерфейсу (например, чтобы добавить экземпляр этого интерфейса в коллекцию), то создаётся анонимный класс и его экземпляр. Если же лямбда используется только для её вызова (явного или внутри другой лямбды), то приведение к функциональному интерфейсу уже не требуется и, соответственно, анонимный класс не создаётся. Но это уже оптимизация. В общем случае обойтись без анонимных классов не получится.
$ /opt/jdk1.8.0/bin/java -version
java version "1.8.0-ea"
Java(TM) SE Runtime Environment (build 1.8.0-ea-b111)
Java HotSpot(TM) Client VM (build 25.0-b53, mixed mode)
$ /opt/jdk1.8.0/bin/java -hotspot -version
Unrecognized option: -hotspot
Error: Could not create the Java Virtual Machine.
Error: A fatal exception has occurred. Program will exit.
$ /opt/jdk1.8.0/bin/java -client -version
java version "1.8.0-ea"
Java(TM) SE Runtime Environment (build 1.8.0-ea-b111)
Java HotSpot(TM) Client VM (build 25.0-b53, mixed mode)
$ /opt/jdk1.8.0/bin/java -server -version
Error occurred during initialization of VM
Server VM is only supported on ARMv7+ VFP
А, не увидел. Видимо, старая версия. В более новых вроде бы уже поддерживается.
Вообще, с поддержкой HotSpot для ARM всё не просто. Вроде бы есть сторонняя (не Oracle) реализация, и называется она ZeroVM. Вот тут написано. Но она для IcedTea. Про поддержку в OpenJDK именно для ARM ничего не знаю.
А я и поставил. И проблему решил. И поделился решением в самом первом посте. Только вам почему-то оно не понравилось. При том, что вы, похоже, Raspberry, в глаза не видели. Ну что же, критикуешь — предлагай. И не надо больше теорий. Только практика.
OpenJDK 8 даже не пробовал, если честно. Я лишь знаю, что OpenJDK 7 загружает процессор в разы (в моём случае — более чем в 5 раз) больше, чем Oracle JDK8. В причинах я не разбирался. Возможно, дело в отсутствии HotSpot. Это не важно, потому что факт остаётся фактом: OpenJDK (актуальную версию) использовать на Raspberry PI невозможно.
В том числе и мной. Серьёзные проблемы с производительностью OpenJDK на Raspberry PI, впрочем, известны всякому, кто пытался запускать на ней что-то посерьёзнее Hello World.
Вот только openjdk на Raspberry PI использовать крайне не рекомендуется. Тормозит и жрёт ресурсы неимоверно. Лучше использовать JDK8 EA от Oracle. Реально в разы быстрее шевелится.
Семантически, лямбда — это именно анонимный класс, и обращаться с ней нужно соответственно. Другое дело — как это реализовано. Да, компилятор генерирует invokedynamic для лямбда-функций. А создавать ли анонимный класс JRE решает уже во время исполнения.
Если нужно явно привести лямбду к функциональному интерфейсу (например, чтобы добавить экземпляр этого интерфейса в коллекцию), то создаётся анонимный класс и его экземпляр. Если же лямбда используется только для её вызова (явного или внутри другой лямбды), то приведение к функциональному интерфейсу уже не требуется и, соответственно, анонимный класс не создаётся. Но это уже оптимизация. В общем случае обойтись без анонимных классов не получится.
habrahabr.ru/post/209470/#comment_7217626
habrahabr.ru/post/209470/#comment_7217870
Вообще, с поддержкой HotSpot для ARM всё не просто. Вроде бы есть сторонняя (не Oracle) реализация, и называется она ZeroVM. Вот тут написано. Но она для IcedTea. Про поддержку в OpenJDK именно для ARM ничего не знаю.
apt-get install openjdk-7-jdk
и именно о ней идёт речь в статье.
Нужна другая сборка? Попробуйте найти и проверить производительность. И не нужно будет теоретизировать.
А в стандартной JavaSE/OpenJDK 7? Судя по всему — нет.
В любом случае — это не важно. OpenJDK 7 непригодна для использования на Raspberry Pi.
В OpenJDK на ARM используется JamVM или ZeroVM. В Oracle JDK — HotSpot VM.
Я неправ? Тогда проясните. Это же вы вроде в Oracle работаете, а не я.