Java 8 Released

    Поздравляю всех с официальным выходом Java 8.
    Основные ссылки по данному вопросу:
    1. Ссылка на скачивание
    2. Ссылка на перечень изменений

    Для тех кому лень идти по ссылке
    --/--
    126 Lambda Expressions & Virtual Extension Methods
    138 Autoconf-Based Build System
    160 Lambda-Form Representation for Method Handles
    161 Compact Profiles
    162 Prepare for Modularization
    164 Leverage CPU Instructions for AES Cryptography
    174 Nashorn JavaScript Engine
    176 Mechanical Checking of Caller-Sensitive Methods
    179 Document JDK API Support and Stability

    vm/--
    142 Reduce Cache Contention on Specified Fields

    vm/gc
    122 Remove the Permanent Generation

    173 Retire Some Rarely-Used GC Combinations

    vm/rt
    136 Enhanced Verification Errors
    147 Reduce Class Metadata Footprint
    148 Small VM
    171 Fence Intrinsics

    core/--
    153 Launch JavaFX Applications

    core/lang
    101 Generalized Target-Type Inference
    104 Annotations on Java Types
    105 DocTree API
    106 Add Javadoc to javax.tools
    117 Remove the Annotation-Processing Tool (apt)
    118 Access to Parameter Names at Runtime
    120 Repeating Annotations
    139 Enhance javac to Improve Build Speed
    172 DocLint

    core/libs
    103 Parallel Array Sorting
    107 Bulk Data Operations for Collections
    109 Enhance Core Libraries with Lambda
    112 Charset Implementation Improvements
    119 javax.lang.model Implementation Backed by Core Reflection
    135 Base64 Encoding & Decoding
    149 Reduce Core-Library Memory Usage
    150 Date & Time API
    155 Concurrency Updates
    170 JDBC 4.2
    177 Optimize java.text.DecimalFormat.format
    178 Statically-Linked JNI Libraries
    180 Handle Frequent HashMap Collisions with Balanced Trees

    core/i18n
    127 Improve Locale Data Packaging and Adopt Unicode CLDR Data
    128 BCP 47 Locale Matching
    133 Unicode 6.2

    core/net
    184 HTTP URL Permissions

    core/sec
    113 MS-SFU Kerberos 5 Extensions
    114 TLS Server Name Indication (SNI) Extension
    115 AEAD CipherSuites
    121 Stronger Algorithms for Password-Based Encryption
    123 Configurable Secure Random-Number Generation
    124 Enhance the Certificate Revocation-Checking API
    129 NSA Suite B Cryptographic Algorithms
    130 SHA-224 Message Digests
    131 PKCS#11 Crypto Provider for 64-bit Windows
    140 Limited doPrivileged
    166 Overhaul JKS-JCEKS-PKCS12 Keystores
    web/jaxp 185 JAXP 1.5: Restrict Fetching of External Resources

    По большинству новшевств уже было много статей на хабре, например, можно посмотреть вот этот перевод habrahabr.ru/post/188850

    Поддержка со стороны IDE:
    1. Eclipse — к последней версии необходимо было до установить плагин, см комментарий habrahabr.ru/post/216303/#comment_7416023
    2. IJ IDEA — поддерживает в 13ой версии www.jetbrains.com/idea/whatsnew
    3. NetBeans — используем последнюю версию.

    Похожие публикации

    AdBlock похитил этот баннер, но баннеры не зубы — отрастут

    Подробнее
    Реклама

    Комментарии 79

      +27
      Ура! Наконец-то джависты откроют для себя замечательный мир лямбд и перестанут кричать «лямбды не нужны», потому что в джаве их не было.
        0
        В связи с этим, может посоветуете какое нибудь достойное чтиво на эту тему (на русском, английском, немецком)? Буду очень благодарен.

        И, да. Мои поздравления, коллеги!
        +1
        Ну лямбды ввели, давно пора, а нормальная поддержка higher-order функций уже есть или по прежнему нужно сооружать чудовищные конструкции с классами?
          +1
          В этом плане ничего не изменилось. Лямбда, по сути — просто синтаксический сахар для создания анонимного класса с единственным абстрактным методом.

          Т.е. higher-order функция объявляется вполне стандартно:
          filter(Predicate<? super T> predicate)
          


          Но вот при использовании можно вместо
          filter(new Predicate<Object>() {
              public boolean test(Object o) {
                  return true;
              }
          });
          

          писать
          filter(o -> true)
          


          Внутри, на самом деле, неявно создается аноним.
            +9
            Не соглашусь.

            Во-первых, с помощью лямбд можно вполне себе элегантно реализовать функции высшего порядка:
            Function<Double, Double> f = Math::sin;
            Function<Double, Double> g = f.andThen(Math::sqrt).andThen((x) -> 2 * x);
            System.out.println(g.apply(Math.PI / 6));
            

            Во-вторых, никаких анонимных классов нет.
            Лямбды компилируются в invokedynamic со вспомогательными методами в том же классе.
              +2
              Насчёт анонимных классов вы не вполне правы.

              Семантически, лямбда — это именно анонимный класс, и обращаться с ней нужно соответственно. Другое дело — как это реализовано. Да, компилятор генерирует invokedynamic для лямбда-функций. А создавать ли анонимный класс JRE решает уже во время исполнения.

              Если нужно явно привести лямбду к функциональному интерфейсу (например, чтобы добавить экземпляр этого интерфейса в коллекцию), то создаётся анонимный класс и его экземпляр. Если же лямбда используется только для её вызова (явного или внутри другой лямбды), то приведение к функциональному интерфейсу уже не требуется и, соответственно, анонимный класс не создаётся. Но это уже оптимизация. В общем случае обойтись без анонимных классов не получится.
                +5
                Семантически лямбда — это «нечто реализуещее требуемый интерфейс», никакого анонимного класса.
                  0
                  В Java реализовывать интерфейс может только класс. И лямбды сведены именно к классам. Новой языковой сущности для лямбд в Java не предусмотрено. Они введены именно как синтаксический сахар. Видимо, для лучшей обратной совместимости.
                    +12
                    Сэр, вы не правы.
                    Это я Вам как разработчик лямбд говорю.
                      0
                      Да? И как тогда реализуется следующий код без создания классов:
                      Runnable lambda = () -> System.out.println("Hello from lambda");
                      System.out.println(lambda.getClass());
                      
                        0
                        Анонимный класс появляется во время исполнения, но синтаксическим сахаром ваш пример никак не является. Компилируется это дело в public void метод с названием lambda$N (где N — 0,1,2,3). Анонимный лямбда-метод, если хотите :)
                          0
                          Обратите внимание на вызов getClass(). Сама возможность этого вызова означает наличие класса.

                          В общем, по моему мнению, как бы авторы не пытались запудрить мозги со своим «лямбда — это не классы» на деле — это всё-таки классы. И не избавятся они от этого факта, покуда в JVM не появится отдельная сущность для лямба-функций. Чего не произойдёт никогда. Рад буду ошибиться.
                            0
                            А класс то и не отрицался.
                            Отрицается тезис, что это синтаксический сахар для анонимных классов.
                            А знаете сколько внутри Oracle JVM внутренних классов генерится? уууууу ;)
                            Факт вообще какого-то класса ни на что не влияет.

                            И кстати, зафиксировано, что поведение getClass для лямбды неопределено. Сегодня одно возвращаем, в следующем релизе другое. Что хотим то и творим. ;)
                        +1
                        Кстати, было бы интересно узнать о деталях реализации из «первых рук». Может, напишете статью по этому поводу? Думаю, не только мне хотелось бы с этим разобраться на более глубоком уровне.
                          0
                          сорцы же есть :)
                            +3
                            Ну а зачем я 100500 докладов про лямбды сделал? Вот например
                            http://jeeconf.com/archive/jeeconf-2013/materials/jdk8-lambda/

                            Вы пожалуйста не путайте 2 вещи: язык и реализацию. В языке (спецификации) четко и ясно :) сказано «нечто реализуещее требуемый интерфейс». ;) То, что первая реализация от Оракла создает некоторые классы на лету еще ничего не значит. И кстати, это нифига не анонимные классы, ибо термин анонимный класс имеет конкретный смысл прописанный в спеке и не нужно мешать понятия. Кстати, как раз анонимные классы — это синтаксический сахар. ;)

                            При этом у нас на подходе есть несколько «более других» реализаций. МетодХэндлы, там рожь всякая…
                            Вот допилим и поменяем. ;)
                            +2
                            оффтоп: а сколько всего разработчиков работало над лямдами? ну просто любопытно каковы масштабы такого изменения в рамках jvm.
                            +1
                            дяденька, посмотрите для интереса, с кем Вы спорите.
                              +9
                              Я читаю и слушаю что говорят, а не кто говорит.
                                0
                                зачем этот неуместный пафос? :) Если коротко, то Ваши догадки не верны.
                                +1
                                Э-э-э… и… с кем?

                                Ну, мне на будущее…
                                  +5
                                  с человеком, которые принимал непосредственное участие в разработке лямбд.
                            +5
                            Мне нравится ход ваших мыслей, но насчет анонимных классов все равно не соглашусь.
                            Анонимный класс — вполне определенная конструкция языка, и лямбды таковой не являются.
                            Может, хотя бы это вас убедит:
                              Runnable anonymous = new Runnable() {
                                  @Override
                                  public void run() {
                                      System.out.println("Hello from anonymous");
                                  }
                              };
                            
                              Runnable lambda = () -> System.out.println("Hello from lambda");
                            
                              System.out.println(anonymous.getClass().isAnonymousClass());  // true
                              System.out.println(lambda.getClass().isAnonymousClass());  // false
                            
                              0
                              Интересное замечание. Формально вы, разумеется, правы. Вот только сути это не меняет: класс всё равно создаётся. Пусть его нельзя назвать «анонимным классом» в терминологии Java, но, тем не менее, это анонимный класс, в смысле отсутствия у него имени.
                                +5
                                А вот давайте не придумывать терминологию. А получится, что мы будем говорить о разном.
                                И анонимный класс, кстати, имя то как раз имеет. ;)
                                0
                                1. ответ на Ваш пред. коммент: а я и не говорил, что функции высших порядков нельзя реализовать элегантно, я лишь сказал что в этом месте за исключением очень удобного сахара, не изменилось ничего. А вот сам сахар и добавляет элегантности.

                                2. Тем не менее, если верить исходникам, то после вызова invokedynamic, внутри бутстрап метода, как раз явно создается класс через asm и загружается через unsafe. Да, это не «старый добрый аноним», а некая более оптимизированная его версия. Но по сути, неявное создание класса все же есть.
                                  0
                                  Это я смотрел в случае filter, map и пр. Т.е. когда нам обязательно нужен именно экземпляр интерфейса. Если вызывать метод сразу на месте, то, возможно, класс не создается. Не смотрел еще.

                                  Хотя думаю, что все равно будет. В любом случае надо ведь записать что-то в переменную.
                                    +3
                                    1. По данному пункту хотелось бы в первую очередь понять, а что вы имеете ввиду говоря «синтаксический сахар»?
                                    Синтаксический сахар — это некая альтернативная форма записи чего-либо, не меняющая семантику этого «чего-либо». Если же при этом меняется семантика — то это не сахар. И лямбды — это не сахар.
                                    Можно конечно начать юлить, что «да семантика поменялась, а суть не поменялась — значит сахар». Но при таком подходе, мы быстро дойдем до того, что все языки программирования это синтаксический сахар к машинному коду целевой платформы.

                                    2. Опять, не смешивайте язык и реализацию. В спецификации языка намеренно не указан способ реализации лямбд. Как раз для того, чтобы потом поменять его.
                                    Даже на текущий момент, ничто мне не мешает, реализовать внутри JVM функциональные указатели, и сделать лямбды через них, при этом язык никак меняться не будет.

                                    Ну и конечно факт, что в текущей реализации неявное создание некого класса есть, никто не отрицает. Но в этом смысле и рефлекшн создает классы — значит это сахар к анонимам и многое что другое это сахар. Не нужно всё сводить к сахару, а то у нас сводилка слипнется. ;)
                                      +1
                                      Спасибо за развернутый ответ. С такой формулировкой полностью согласен. Я, действительно, все свои выводы про сахар сделал относительно текущей реализации.
                                      оффтоп
                                      Если честно, то сомневаюсь, что она когда-нибудь поменяется.


                                      Мне просто очень не нравятся заявления в духе «чушь, там invokedynamic», без добавления, что в текущей реализации класс все же создается.

                                      Не нужно всё сводить к сахару, а то у нас сводилка слипнется. ;)

                                      Прошу заметить, я нигде не сказал что сахар — это плохо.
                                        0
                                        > Если честно, то сомневаюсь, что она когда-нибудь поменяется.
                                        Зря.
                                        вот тут, последнее предложение.

                                          0
                                          Может я что-то не понимаю, прошу пояснить если так.

                                          Как это сделать через MethodHandle? У нас функция filter принимает Predicate. И тут хочешь не хочешь, но этот Predicate надо иметь. Или имеется ввиду что будет не класс на каждое создание лябды, а единственный класс с полем final MethodHandle? Но, опять же, одним классом не обойтись. Как минимум класс на интерфейс.
                                            0
                                            Вам важен сам факт генерации класса? А для чего?
                                            «единственный класс с полем final MethodHandle» — ну это уж точно не сахар ;)

                                            Даже не думая я могу набросать/набросить парочку вариантов реализации совсем без класса. ;)
                                            А уж если подууууумать. ;)
                                            Вопрос в другом — а зачем? Метод выливания чайника никто не отменял. ;)
                                              0
                                              Я Вам задаю один вопрос, Вы мне отвечаете на другой.

                                              Вам важен сам факт генерации класса?
                                              Нет. Мне важен факт понимания реализации.

                                              ну это уж точно не сахар
                                              А где я это говорил?

                                              реализации совсем без класса.
                                              Вот об этом я и спросил. Нам в любом случае нужен объект, реализующий интерфейс Predicate. Как в текущей реализации jvm может быть объект, реализующий интерфейс, но при этом «совсем без класса» я не понимаю. Т.е. мне видится, что это фундаментальное ограничение платформы. Как вы «Даже не думая» можете его обойти?

                                              Метод выливания чайника
                                              Что за метод?
                                                +1
                                                > Я Вам задаю один вопрос, Вы мне отвечаете на другой.
                                                А в чем был вопрос? Вы правильно уловили суть как можно реализовать через MH, тут даже комментировать не нужно.

                                                > Нет. Мне важен факт понимания реализации.
                                                Тогда пока лучше стоит ограничится текущей реализацией — секретный класс на каждую лямбду. ;)

                                                > Нам в любом случае нужен объект, реализующий интерфейс Predicate.
                                                > Как вы «Даже не думая» можете его обойти?
                                                Зачем? Сам Predicate нам не нужен. Нам нужно чтобы у Predicate можно было вызвать test. Соответственно можно везде вместо Predicate использовать MH на нужный метод, ну или даже некий внутренний функциональный указатель.
                                                Это вариант 1.
                                                Вариант 2: total inline в нужном месте с удалением ненужного промежутного мусора.

                                                > фундаментальное ограничение платформы
                                                «Ограничение» — это слово содержащее в себе негативную коннотацию. Я бы на вашем месте не был так категорчен. ;) А вдруг это не ограничение, а наоборот преимущество. ;)

                                                >> Метод выливания чайника
                                                >Что за метод?

                                                Ой. Этому что, уже не учат?

                                                Физику и математику дают задачу. Есть кран с водой, чайник, плита, нужно вскипятить полный чайник воды.
                                                Физик – берет чайник, набирает воду, ставит на плиту, включает плиту, садится ждет.
                                                Математик – берет чайник, набирает воду, ставит на плиту, включает плиту, садится ждет.

                                                Задачу меняют, кран, чайник, плита, но чайник уже с водой наполовину.
                                                Физик – доливает воду, ставит чайник на плиту, включает плиту, садится и ждет.
                                                Математик – выливает воду из чайника и сводит задачу к предыдущей, решение которой уже известно.
                                                  0
                                                  Ой. Этому что, уже не учат?
                                                  Учат, просто не понял сразу о чем Вы.

                                                  А по теме, спасибо, больше вопросов нет.
                              0
                              чушь, там invokedynamic
                                +2
                                В корне неверно насчет синтаксического сахара и анонимов — там используется invoke dynamic.
                                  +10
                                  Ну вы что, там же invokedynamic!
                                    –3
                                    Про invokedynamic я в курсе, выше написано об этом.
                                +2
                                Пользуясь случаем передаю привет Гвидо и его «нормальные лямбды не нужны»
                                  +2
                                  Я думаю, Гвидо просто ехидно поинтересуется насчет yield в Java.

                                  Если серьезно, то его подход вполне имеет право на существование. Полноценные однострочные (expression) лямбды в питоне есть. Многострочных нет, но никто не мешает обявить именованную локальную функцию и потом передать её, семантика замыкания сохраняется в полной мере (плюс nonlocal в 3k). Для тех же случаев, когда нужны именно многострочные лямбды, делается более сахар под каждый конкретный паттерн — как, например, with и yield.
                                  +1
                                  как говорят, Java сделала лямбды популярными, не имея их (Java has made lambdas popular by not having them)
                                  –2
                                  Аплодирую стоя!
                                    0
                                    Очень рад релизу, мне казалось она должна была выйти в апреле. А что такое Small VM? Кто-нибудь в курсе?

                                    И кстати, я еще пробовал 8 версию до релиза и она действительно в общем была более производительна по сравнению с 7 (где-то на 10-15%).
                                      0
                                      Нашел про Small VM: openjdk.java.net/projects/jdk8/features#148

                                      Это portable версия Java VM, которая весит не более 3 mb.
                                        0
                                        т.е. можно распространять проекты портабельно (не требуя от конечного пользователя развертывания JAVA_vfibys)?
                                          0
                                          Не надо забывать по rt.jar, который даже в случае Compact Profile 1 добавит ~14 мб.
                                          Но в целом, да — можно даже слегка поизвращаться и запаковать в exe-файл лаунчера (WinRun4j или Launch4j) саму JRE при помощи Enigma Virtual Box.
                                          Остается только собрать Compact Profile для Windows так как официальных сборок нет.
                                          Все будет выглядеть как обычное приложение, не требующее установленую Java. Выдавать будут только лежащие рядом jar-файлы, которые тоже можно запаковать, но при использовании сжатия (при запаковке в exe) это лишь замедлит старт приложения, к тому же не всегда будет работать.
                                          Да, я знаю, что гнусный извращенец и можно просто воспоользоваться, например Excelsior JET :)
                                            0
                                            Т.е. они сделали Small VM без учета Runtime библиотеки?
                                              0
                                              Просто оптимизировали сборку libjvm.so — по размеру результируемого файла, а не по быстродействию, с оговоркой, что быстродействие не должно упасть более чем на 5%.
                                              0
                                              Есть стандартные средства для этого: habrahabr.ru/post/178481/
                                                0
                                                Ну эти «стандартные средства» от JavaFX появились не так давно, да и набор функций отличается от тех, что предлагают лаунчеры. Надо смотреть что конкретно нужно.
                                        0
                                        Обновлял страницу со вчерашнего дня! Пока не понял, что в Калифорнии время «немного другое»… Наконец-то! Столько времени ожидания и вот такие хорошие новости!
                                          +1
                                          Ещё Scala 2.11 на подходе. Вот так праздник.
                                            +1
                                            Новая версия — это хорошо, и рад за джавистов, джаверов и прочих любителей кофе, но очень надеюсь, что не будет как в прошлый раз, при переходе с 6 на 7.
                                            К самому Ораклу претензий нет, но у нас в Казахстане куча сервисов электронного правительства, госзакупки, налоговая и прочее работает на Java. И вот при выходе 7-ки народ на местах обновился, и половина сервисов превратилась в тыкву.
                                            Повторюсь — к самому Ораклу претензий особых нет, все из-за криворуких программеров наших сервисов, но апгрейда у пользователей жду с некоторой опаской.
                                              0
                                              Как так? Ведь обратная совместимость — краеугольный камень JavaVM. Что можно было такого наворотить, из-за чего перестало работать на новых версиях? Примеры можете привести?
                                                +2
                                                Да легко, далеко ходить не будем. Несколько месяцев назад выходил новый апдейт (не с 6 на 7, а что-то там с 41 на 45, не помню точно цифры). При установке предупреждала — со следующего релиза неподписанные апплеты запускаться при настройках по умолчанию не будут.
                                                Прошел месяц или два. вышел новый апдейт, о котором предупреждали.
                                                И что вы думаете — пришлось по всем юзерам пройтись и настроить уровень безопасности минимальный и добавить сайты с неподписанными апплетами в список исключений.
                                                Это просто один пример, навскидку.
                                                При переходе с 6 на 7 вообще было здорово — один из банк-клиентов отказался работать с 7-кой, а вот кабинет налогоплательщика очень быстро отказался работать с 6-й. Пару месяцев пришлось подождать, пока они между собой не синхронизировались.
                                                [sarcasm]Ну оно понятно, ведь для наших джава-разработчиков выход каждой новой версии абсолютно неожиданный, а тестовых и бета версий, чтобы проверить свои апплеты, просто не существует[/sarcasm]
                                                  0
                                                  Это проблема менеджмента, а не разработчиков. Разработчики решают проблемы, которые им ставит руководство, а не тестируют разные продукты на всех новых бета-версиях джавы. Тестировать должны в первую очередь тестировщики согласно плана, который составляется при участии менеджера. Т.е. в плане написано — отслеживать выход новых бета версий JVM, тестировать весь функционал при их выходе. Тестировщик тестирует, выявляет баг, а потом разработчик его исправляет.
                                                    0
                                                    Под разработчиками я имею в виду всех тех, кто предоставляет нам и, хуже того, обязывает нас использовать сырой неоттестированный продукт. Меня мало волнуют их внутренние самоназвания и бизнес-процессы. Меня волнует только то, что после апгрейда возможны проблемы. А если они возможны, значит, они будут.
                                                  +2
                                                  Я поступлю нескромно и дам ссылку на своё выступление:


                                                  Там есть про несовместимости как про управление рисками.
                                                +2
                                                Ура!

                                                Ходят слухи, что 3 апреля в питерском офисе Oracle будет большая Java 8 Launch Party со свободным входом. Будут подробности — напишу.
                                                  +2
                                                  Теперь хочется Java 8 для Android)
                                                    0
                                                    Еще годик подождем, видимо)
                                                      +1
                                                      Не один годик я, бы сказал…
                                                      0
                                                      Простой вопрос: будут ли исходники, написанные на Java 8, компилироваться в target Java 7/6? В свое время переход с 1.4 -> 5.0 был достаточно болезненным по причине несовместимости байткода и затянулся на 5 лет.
                                                        0
                                                        Такой возможности нет, если хотите использовать новые фичи языка. Появились некоторые новые инструкции в байткоде JVM, которых нет даже в JVM 1.7
                                                          0
                                                          а какие?
                                                        0
                                                        А для перфоманса она что дает?
                                                          +2
                                                          Как минимум Stream Style, это опять же к докладу Walrus, LongAdder, AES, да и много другого вкусного по ссылке в топике.
                                                            0
                                                            Попытался частично ответить на ваш вопрос в своем посте.
                                                            0
                                                            наверное не совсем по теме, но можно ли как то уже под винду в виде zip скачать? ( portableapps.com/apps/utilities/java_portable отстает да)
                                                            и совсем не по теме: почему все же у оракла (вроде начиная с 1.7) больше нет этого вариант скачивания? есть еще разработчики без админских прав на тачках, да ))
                                                              0
                                                              При помощи 7-zip и лежащего внутри unpack200 можно из exe получить всё, что нужно. Либо перенести с другой машины. Стандартного варианта скачивания увы нет.
                                                                0
                                                                Плюсую. И под OS X приходится выковыривать нужный каталог с помощью хитрых заклинаний. Добавьте архив под все платформы, это просто и удобно.
                                                                0
                                                                Ну, наконец теперь и в Java «шаблоны проектирования» начнут постепенно заменяться соответствующими им рядовыми примерами из учебников по функциональному программированию…

                                                                Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

                                                                Самое читаемое