Что такое java 8 и для чего он нужен
Перейти к содержимому

Что такое java 8 и для чего он нужен

  • автор:

Переход с Java 7 на Java 8

В этой статье содержатся рекомендации по переносу приложения с Java 7 на Java 8. Использование функций Java 8 не рассматривается.

Для перехода с Java 7 на Java 8 не существует универсального решения. Переход с Java 7 на Java 8 обычно не требует большого объема работы. Проблемы могут возникнуть в связи с несколькими измененными API, повышением строгости определения типа в javac, изменениями в загрузчиках классов и изменениями в permgen (часть системы сборки мусора).

Как правило, наилучшим подходом является попытка запуска на Java 8 без предварительной перекомпиляции. Этот подход позволит запустить приложение максимально быстро. Для библиотеки вашей целью будет публикация артефакта, который компилируется и тестируется с помощью JDK 8.

Прекращение использования Java 7

Поддержка сообщества завершится 29 июля 2022 г., в день окончания срока использования Java 7. Все приложения, работающие на Java 7, будут продолжать работать, но для самой платформы Java 7 не будут предоставляться обновления или исправления для системы безопасности. Чтобы снизить риски и потенциальные уязвимости для системы безопасности, обновите приложения до Java 8 или 11 в зависимости от требований к рабочей нагрузке.

Ниже приведено каноническое справочное руководство по миграции Oracle JDK. В руководстве по миграции рассматриваются все несовместимости в спецификации Java и несовместимости в реализации JDK. Большинство этих несовместимостей являются пограничными случаями, и вы должны изучить их при появлении предупреждения или ошибки.

Запуск на Java 8

Большинство приложений должно работать на Java 8 без изменений. Первое, что нужно попробовать, — это запустить приложение на Java 8 без перекомпиляции кода. Смысл простого запуска заключается в том, чтобы посмотреть, какие предупреждения и ошибки будут выданы во время выполнения. При таком подходе
вы сможете запустить приложение на Java 8 быстрее с минимальными усилиями.

Большинство проблем, с которыми вы можете столкнуться, можно устранить без перекомпиляции кода. Если проблему следует исправлять в коде, сделайте это, но скомпилируйте программу с использованием JDK 7. По возможности постарайтесь запустить приложение на java версии 8 перед компиляцией с использованием JDK 8.

Компиляция с использованием Java 8

Компиляция с использованием JDK 8 может потребовать обновления скриптов сборки, инструментов, тестовых платформ и включенных библиотек. Чтобы получить подробные сведения об использовании внутреннего API JDK и других предупреждениях, запустите javac с параметром -Xlint:unchecked .

Переход с Java 7 для службы приложений Azure

Чтобы перенести службы приложений с Java 7 на Java 8 или 11, войдите на портал Azure, перейдите к веб-приложениям, которые требуется обновить, а затем перейдите в раздел Конфигурация>Параметры>Параметры стека. Вы увидите раскрывающиеся списки для основной и дополнительной версий Java, а также для версии Tomcat, если вы используете Tomcat. Выберите Java 8 или 11. Помните, что вы можете изменить конфигурацию в слоте развертывания, чтобы безопасно протестировать изменение конфигурации, а затем поменять местами новую и рабочую среды. (Пункт «Java 7» может быть скрыт, чтобы клиенты не могли создавать зависимости от старых сред выполнения.) Дополнительные сведения см. в разделе Настройка промежуточных сред в службе приложений Azure.

Use the selector to change your Java version

Вы можете использовать параметр приложения JAVA_TOOLS , если нужно указать новые параметры среды выполнения. Эти параметры будут применены при запуске приложения. Дополнительные сведения см. в разделе Настройка приложения Java для службы приложений Azure. Дополнительные сведения о политиках поддержки для сред выполнения в Службе приложений см. в разделе Встроенная поддержка нескольких языков и платформ статьи Обзор Службы приложений.

Дальнейшие действия

После запуска приложения на Java 8 рекомендуем выполнить следующие шаги по модернизации Java до Java 11 с использованием следующих руководств.

  • Причины перехода на Java 11.
  • Переход с Java 8 на Java 11.

Использование Java 8 Optional в качестве аргументов метода

Java 8 представила класс Optional , который используется для представления наличия или отсутствия значения. Это стало полезным инструментом для решения проблемы NullPointerException , предоставляя явное представление о том, что значение может отсутствовать. Однако существует общепринятое мнение, что использовать Optional в качестве аргументов метода не рекомендуется.

Давайте рассмотрим пример. У нас есть метод, который принимает два параметра, оба из которых могут быть необязательными. Использование Optional в качестве аргумента метода могло бы выглядеть так:

public int calculateSomething(Optional<String> p1, Optional<BigDecimal> p2) < // my logic >

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

Во-первых, использование Optional в качестве аргумента метода может привести к избыточности и сложности кода. Если значение аргумента может быть null , это должно быть ясно указано в документации метода. Если разработчик забыл проверить на null перед передачей значения в метод, Optional не поможет избежать ошибки NullPointerException .

Во-вторых, с точки зрения дизайна, Optional предназначен для использования в качестве возвращаемого типа, чтобы указать, что метод может не вернуть значение. Это не предназначено для использования в качестве аргумента метода, так как это может привести к неправильному использованию и путанице.

В-третьих, использование Optional в качестве аргумента метода может привести к ненужным проверкам на наличие значения. Если метод может корректно обрабатывать null значения, нет необходимости в дополнительной проверке на наличие значения Optional .

Вместо использования Optional в качестве аргументов метода, рекомендуется использовать перегрузку методов или паттерн проектирования Builder для создания более ясного и понятного API. Правильное использование Optional поможет создать более чистый и безопасный код.

Java 8. Все что вам будет нужно

Java-университет

Добро пожаловать в мое представление Java 8. Эта статья проведет тебя шаг за шагом дволь всех новый фич с Java 7 в Java 8. При помощи быстрых и простых примеров кода, мы сможем выучить как использовать Default Interfaces, Method references и Repeatable annotations. В конце статьи мы познакомимся со Stream API.

Java 8. Все что вам будет нужно - 1

Без лишней болтовни — только код и комментарии к нему! Вперед!

Default Methods for Interfaces

Java 8 позволяет нам добавлять не абстрактные методы(которые реализованы) в интерфейсы путем добавления ключевого слова default . Эта возможность так же известна как Extention Methods. Ниже представлен первый пример:

 interface Formula < double calculate(int a); default double sqrt(int a) < return Math.sqrt(a); >> 

Помимо абстрактного метода calculate , в интерфейсе Formula так же определен дефолтный метод sqrt . Классы, реализующие этот интерфейс, должны только реализовать метод calculate . Дефолтный метод sqrt может быть использован «из коробки».

 Formula formula = new Formula() < @Override public double calculate(int a) < return sqrt(a * 100); >>; formula.calculate(100); // 100.0 formula.sqrt(16); // 4.0 

Интерфейс Formula реализован как как анонимный класс. Код избыточный: 6 строк для реализации sqrt(a * 100) . Как мы увидим в следующей секции, есть более красивый способ для реализации одиночного метода в Java 8.

Lambda expressions

Давайте начнем с простого примера сортировки списка строк в предыдущих версиях Java:

 List names = Arrays.asList("peter", "anna", "mike", "xenia"); Collections.sort(names, new Comparator() < @Override public int compare(String a, String b) < return b.compareTo(a); >>); 

Статический метод Collections.sort принимает список и сомпаратор в том порядке, в котором нужно сортировать список. Всегда можно создать анонимный класс компаратора и передать его. Вместо создания анонимного класса, в Java 8 можно сделать более короткую запись, лямбда выражения.

 Collections.sort(names, (String a, String b) -> < return b.compareTo(a); >); 

Как вы видите код намного короче и проще для чтения. Но это можно сделать еще короче:

 Collections.sort(names, (String a, String b) -> b.compareTo(a)); 

Для тела с одной строкой можно пропустить <> и слово return . Но можно сделать это еще короче:

 Collections.sort(names, (a, b) -> b.compareTo(a)); 

Java компилятор знает о типах аргументов, так что их можно пропустить также. Давайте копнем глубже в лямбда выражения и поймем как их можно использовать.

Functional Interfaces

Как лямбда выражения вписываются в систему Java типов? Каждая лямбда соответствует типу, описываемому в интерфейсе. Поэтому функциональный интерфейс должен содержать только один абстрактный метод. Каждое лямбда выражение этого типа будет соответствовать этому абстрактному методу. С момента того, что дефолтные методы не абстрактные, поэтому вы вольны создать дефолтные методы в функциональные интерфейсы сколько нужно. Мы также можем использовать произвольные интерфейсы как лямбда выражения в случае если в этом интерфейсе только один абстрактный метод. Чтобы соответствовать этим требованиям нужно добавить @FucntionalInterface аннотацию. Компилятор знает о ней и выбросит исключение, если если захотите поставить больше одного абстрактного метода. Пример:

@FunctionalInterface interface Converter

 Converter converter = (from) -> Integer.valueOf(from); Integer converted = converter.convert("123"); System.out.println(converted); // 123 

Держите в уме, что код будет также скомпилирован, если @FunctionalInterface аннотация будет пропущена.

Method and Constructor References

Пример выше может быть также сделан еще более меньше путем использования method references:

 Converter converter = Integer::valueOf; Integer converted = converter.convert("123"); System.out.println(converted); // 123 

Java 8 позволяет вам передавать ссылки на метод или констрктор путем добавления :: . Пример выше показывает как можно ссылаться на статический метод, не смотря на это мы также можем ссылаться на нестатические методы:

 class Something < String startsWith(String s) < return String.valueOf(s.charAt(0)); >> 
 Something something = new Something(); Converter converter = something::startsWith; String converted = converter.convert("Java"); System.out.println(converted); // "J" 

Давайте посмотрим, как :: работает с конструкторами. Для начала мы определим в качестве примера класс с разными конструкторами:

 class Person < String firstName; String lastName; Person() <>Person(String firstName, String lastName) < this.firstName = firstName; this.lastName = lastName; >> 

Далее определеим интерфейс для создания новых объектов:
interface PersonFactory

Вместо того, чтобы реализовывать фабрику по создания, мы соединим воедино все это спомощью :: для конструкторов:

 PersonFactory personFactory = Person::new; Person person = personFactory.create("Peter", "Parker"); 

Мы создали ссылку на конструктор через Person::new . Java компилятор автоматически выберет правильный конструктор, который соответствует сигнатуре метода PersonFactory.create . . Продолжение следует. К сожалению я не нашел, как можно сохранить черновик статьи, а это реально странно, а сеанс времени на перевод окончен — поэтому доделаю позже. Всем знающим и понимающим английский — Оринигалая Статья. Если есть предложения по исправлению перевода — пишите любыми доступным вам способом. Мой Github aккаунт

Особенности Java 8 – максимальное руководство (часть 2)

Java-университет

Особенности Java 8 – максимальное руководство (часть 2) - 1

Вторая часть перевода статьи Java 8 Features – The ULTIMATE Guide. Первая часть тут (ссылка может поменяться).

5. Новые возможности в библиотеках Java 8

В Java 8 добавили много новых классов и расширили существующие в целях оказания более эффективной поддержки современного параллелизма, функционального программирования, даты/времени и многого другого.

5.1. Класс Optional

Знаменитый NullPointerException на сегодняшний день является самой популярной причиной сбоев приложений Java. Давным давно прекрасный проект Google Guava представил Optional как решение NullPointerException , тем самым препятствуя загрязнению кода проверками на null, как следствие поощряя написание более чистый код. Вдохновленные Google Guava класс Optional сейчас часть Java 8. Optional всего лишь контейнер: он может содержать значение или некоторый тип Т или просто быть null. Он предоставляет много полезных методов так что явные проверки на null теперь не имеют оправданий. Обратитесь к официальной документации для более детальной информации. Давайте посмотрим на два небольших примера использования Optional : с использованием null и без него.

 Optional fullName = Optional.ofNullable( null ); System.out.println( "Full Name is set? " + fullName.isPresent() ); System.out.println( "Full Name: " + fullName.orElseGet( () -> "[none]" ) ); System.out.println( fullName.map( s -> "Hey " + s + "!" ).orElse( "Hey Stranger!" ) ); 

Метод isPresent() возвращает true если экземпляр Optional содержит не null значение и false в противном случае. Метод orElseGet() содержит запасной механизм результата, если Optional содержит null, принимая функции для генерации значения по умолчанию. Метод map() преобразует текущее значение Optional и возвращает новый экземпляр Optional . Метод orElse() похож на orElseGet() , но вместо функции он принимает значение по умолчанию. Вот вывод данной программы:

 Full Name is set? false Full Name: [none] Hey Stranger! 

Давайте кратко рассмотрим другой пример:

 Optional firstName = Optional.of( "Tom" ); System.out.println( "First Name is set? " + firstName.isPresent() ); System.out.println( "First Name: " + firstName.orElseGet( () -> "[none]" ) ); System.out.println( firstName.map( s -> "Hey " + s + "!" ).orElse( "Hey Stranger!" ) ); System.out.println(); 

Результат будет таким:

 First Name is set? true First Name: Tom Hey Tom! 

Для более детальной информации обратитесь к официальной документации.

5.2. Потоки

Недавно добавленный Stream API ( java.util.stream ) представляет реальное программирование в функциональном стиле в Java. Это, безусловно, наиболее полное дополнение к библиотеке Java, которое позволяет разработчикам Java быть значительно более эффективными, а также дает возможность им создать эффективный, чистый и краткий код. Stream API значительно упрощает обработку коллекций (но не ограничиваясь только ими, как мы увидим позже). Возьмем для примера простой класс Task .

 public class Streams < private enum Status < OPEN, CLOSED >; private static final class Task < private final Status status; private final Integer points; Task( final Status status, final Integer points ) < this.status = status; this.points = points; >public Integer getPoints() < return points; >public Status getStatus() < return status; >@Override public String toString() < return String.format( "[%s, %d]", status, points ); >> > 

Task имеет некоторое представление о очках (или псевдо-сложностях) и может быть либо OPEN либо CLOSE. Давайте введем небольшую коллекцию задач, чтобы поиграть с ними.

 final Collection tasks = Arrays.asList( new Task( Status.OPEN, 5 ), new Task( Status.OPEN, 13 ), new Task( Status.CLOSED, 8 ) ); 

Первый вопрос, который мы намерены выяснить, это сколько очков содержат задачи со статусом OPEN сейчас? До Java 8 обычным решением для этого было бы использование итератора foreach . Но в Java 8 ответ в потоках: последовательность элементов, которые поддерживают последовательные и параллельные агрегатные операции.

 // Подсчет общего количества очков всех активных задач с использованием sum() final long totalPointsOfOpenTasks = tasks .stream() .filter( task -> task.getStatus() == Status.OPEN ) .mapToInt( Task::getPoints ) .sum(); System.out.println( "Total points: " + totalPointsOfOpenTasks ); 

И вывод на консоль будет выглядеть как:

 Total points: 18 

Рассмотрим что здесь происходит. Во-первых, коллекция задач конвертируется в потоковое представление. Затем операция filter отфильтровывает все задачи со статусом CLOSED. На следующем шаге операция mapToInt преобразует поток Task s в поток Integer s используя метод Task::getPoints для каждого экземпляра Task . И наконец, все очки суммируются с использованием метода sum , который предоставляет конечный результат. Прежде чем перейти к следующим примерам, есть некоторые замечания о потоках, которые нужно иметь в виду (более детально здесь). Операции stream делятся на промежуточные и конечные операции. Промежуточные операции возвращают новый поток. Они всегда ленивые, при выполнении промежуточных операций, таких как filter , они не выполняют фильтрацию на самом деле, вместо этого создается новый поток, который по завершению формирования, содержит элементы исходного потока, которые соответствуют заданному предикату. Конечные операции, такие как forEach и sum , могут пройти через поток для получения результата или побочного эффекта. После того как конечная операция выполняется, поток считается использованным и не может быть больше использован. Практически во всех случаях конечные операции стремятся завершить свое прохождение по базовому источнику данных. Другая ценная возможность потоков – это поддержка параллельных процессов из коробки. Давайте посмотрим на этот пример, который находит сумму очков всех задач.

 // Calculate total points of all tasks final double totalPoints = tasks .stream() .parallel() .map( task -> task.getPoints() ) // or map( Task::getPoints ) .reduce( 0, Integer::sum ); System.out.println( "Total points (all tasks): " + totalPoints ); 

Это очень похоже на первый пример, за исключением того, что мы пытаемся обработать все задачи параллельно и рассчитать конечный результат используя метод reduce . Вот вывод в консоль:

 Total points (all tasks): 26.0 

Часто возникает необходимость в группировке элементов по определенному критерию. Пример демонстрирует как потоки могут помочь с этим.

 // Группировка задач по их статусу final Map> map = tasks .stream() .collect( Collectors.groupingBy( Task::getStatus ) ); System.out.println( map ); 

Вывод в консоль будет следующим:

Чтобы закончить с примерами для задач, давайте вычислим общий процент (или вес) каждой задачи в коллекции основанный на общем количестве очков:

 // Подсчет веса каждой задачи (как процент от общего количества очков) final Collection result = tasks .stream() // Stream .mapToInt( Task::getPoints ) // IntStream .asLongStream() // LongStream .mapToDouble( points -> points / totalPoints ) // DoubleStream .boxed() // Stream .mapToLong( weigth -> ( long )( weigth * 100 ) ) // LongStream .mapToObj( percentage -> percentage + "%" ) // Stream .collect( Collectors.toList() ); // List System.out.println( result ); 

Вывод в консоль будет таким:

 [19%, 50%, 30%] 

И наконец, как мы отмечали ранее, Stream API предназначено не только для коллекций Java. Типичная операция ввода-вывода, такая как чтение текстовых файлов построчно, является очень хорошим кандидатом для использования потоковой обработки. Вот небольшой пример для подтверждения этого.

 final Path path = new File( filename ).toPath(); try( Stream lines = Files.lines( path, StandardCharsets.UTF_8 ) ) < lines.onClose( () ->System.out.println("Done!") ).forEach( System.out::println ); > 

Метод onConsole , который вызывается в потоке, возвращает эквивалентный поток с дополнительным закрытым обработчиком. Закрытый обработчик вызывается когда метод close() вызывается в потоке. Stream API вместе с лямбдами и ссылочными методами в совокупности с методами по умолчанию и статическими методами в Java 8 являются ответами современным парадигмам в разработке программного обеспечения. Для более детальной информации обращайтесь к официальной документации.

5.3. API для даты/времени (JSR 310)

Java 8 дает новый взгляд на управление датой и временем предоставляя новый API для даты и времени (JSR 310). Манипуляции с датой и временем являются одной из худших болевых точек для Java разработчиков. Стандартный java.util.Date следующий за java.util.Calendar в общем не улучшил ситуацию (возможно, сделал ее даже более запутанной). Вот как родился Joda-Time: прекрасная альтернатива API даты/времени для Java. Новый API для даты/времени в Java 8 (JSR 310) находится под сильным влиянием Joda-Time и взял лучшее из нее. Новый пакет java.time содержит все классы для даты, времени, даты/времени, часовых поясов, продолжительностей и манипуляций со временем. В дизайне API неизменяемость была учтена очень серьезно: изменения не допускаются (жесткий урок извлеченный из java.util.Calendar ). Если требуется модификация – будет возвращен новый экземпляр соответствующего класса. Давайте посмотрим на основные классы и примеры их использования. Первый класс Clock , который предоставляет доступ к текущему мгновению, дате и времени, используя часовой пояс. Clock может быть использован вместо System.currentTimeMillis() и TimeZone.getDefault() .

 // Получить системное время как смещение UTC final Clock clock = Clock.systemUTC(); System.out.println( clock.instant() ); System.out.println( clock.millis() ); 

Пример вывод на консоль:

 2014-04-12T15:19:29.282Z 1397315969360 

Другие новые классы, которые мы будем рассматривать – это LocaleDate и LocalTime . LocaleDate содержит только часть даты без часового пояса в календарной системе ISO-8601. Соответственно, LocalTime содержит только часть времениcode>.

 // получить местную дату и время время final LocalDate date = LocalDate.now(); final LocalDate dateFromClock = LocalDate.now( clock ); System.out.println( date ); System.out.println( dateFromClock ); // получить местную дату и время время final LocalTime time = LocalTime.now(); final LocalTime timeFromClock = LocalTime.now( clock ); System.out.println( time ); System.out.println( timeFromClock ); 

Пример вывода на консоль:

 2014-04-12 2014-04-12 11:25:54.568 15:25:54.568 

LocalDateTime объединяет вместе LocaleDate и LocalTime и содержит дату и время, но без часового пояса в календарной системе ISO-8601. Простой пример приведен ниже.

 // Get the local date/time final LocalDateTime datetime = LocalDateTime.now(); final LocalDateTime datetimeFromClock = LocalDateTime.now( clock ); System.out.println( datetime ); System.out.println( datetimeFromClock ); 

Пример вывода на консоль:

 2014-04-12T11:37:52.309 2014-04-12T15:37:52.309 

В случае, если вам нужна дата/время для конкретного часового пояса, вам поможет ZonedDateTime . Он содержит дату и время в календарной системе ISO-8601. Вот несколько примеров для разных часовых поясов.

 // Получение даты/времени для временной зоны final ZonedDateTime zonedDatetime = ZonedDateTime.now(); final ZonedDateTime zonedDatetimeFromClock = ZonedDateTime.now( clock ); final ZonedDateTime zonedDatetimeFromZone = ZonedDateTime.now( ZoneId.of( "America/Los_Angeles" ) ); System.out.println( zonedDatetime ); System.out.println( zonedDatetimeFromClock ); System.out.println( zonedDatetimeFromZone ); 

Пример вывода на консоль:

 2014-04-12T11:47:01.017-04:00[America/New_York] 2014-04-12T15:47:01.017Z 2014-04-12T08:47:01.017-07:00[America/Los_Angeles] 

И, наконец, давайте взглянем на класс Duration : промежуток времени в секундах и наносекундах. Это делает вычисление между двумя датами очень простым. Давайте посмотрим как это сделать:

 // Получаем разницу между двумя датами final LocalDateTime from = LocalDateTime.of( 2014, Month.APRIL, 16, 0, 0, 0 ); final LocalDateTime to = LocalDateTime.of( 2015, Month.APRIL, 16, 23, 59, 59 ); final Duration duration = Duration.between( from, to ); System.out.println( "Duration in days: " + duration.toDays() ); System.out.println( "Duration in hours: " + duration.toHours() ); 

В приведенном выше примере вычисляется продолжительность (в днях и часах) между двумя датами, 16 апреля 2014 и 16 апреля 2015. Вот пример вывода на консоль:

 Duration in days: 365 Duration in hours: 8783 

Общее впечатление о новой дате/времени в Java 8 очень, очень положительное. Частично потому, что изменения основаны на проверенном в боях фундаменте (Joda-Time), частично потому, что в этот раз этот вопрос пересматривался серьезно и голоса разработчиков были услышаны. Для получения деталей обратитесь к официальной документации.

5.4. Движок Nashorn JavaScript

Java 8 поставляется с новым движком Nashorn JavaScript, который позволяет вести разработку и запуск определенных видов приложений JavaScript на JVM. Движок Nashorn JavaScript это просто еще одна реализация javax.script.ScriptEngine, которая выполняет тот же набор правил для разрешения взаимодействия Java и JavaScript. Вот небольшой пример.

 ScriptEngineManager manager = new ScriptEngineManager(); ScriptEngine engine = manager.getEngineByName( "JavaScript" ); System.out.println( engine.getClass().getName() ); System.out.println( "Result:" + engine.eval( "function f() < return 1; >; f() + 1;" ) ); 

Пример вывода на консоль:

 jdk.nashorn.api.scripting.NashornScriptEngine Result: 2 

5.5. Base64

Наконец, поддержка кодирования Base64 нашла свое место в стандартной библиотеке Java с появлением релиза Java 8. Это очень просто в использовании, пример демонстрирует это.

 package com.javacodegeeks.java8.base64; import java.nio.charset.StandardCharsets; import java.util.Base64; public class Base64s < public static void main(String[] args) < final String text = "Base64 finally in Java 8!"; final String encoded = Base64 .getEncoder() .encodeToString( text.getBytes( StandardCharsets.UTF_8 ) ); System.out.println( encoded ); final String decoded = new String( Base64.getDecoder().decode( encoded ), StandardCharsets.UTF_8 ); System.out.println( decoded ); >> 

Вывод в консоль программы показывает как кодированный так и декодированный текст:

 QmFzZTY0IGZpbmFsbHkgaW4gSmF2YSA4IQ== Base64 finally in Java 8! 

Есть также классы URL-дружественные кодеры/декодеры, а также MIME-дружественные кодеры/декодеры ( Base64.getUrlEncoder() / Base64.getUrlDecoder() , Base64.getMimeEncoder() / Base64.getMimeDecoder() ).

5.6. Параллельные массивы

Релиз Java 8 добавляет много новых методов для параллельной обработки массивов. Возможно, наиболее важным из них является parallelSort() , который может значительно ускорить сортировку на многоядерных машинах. Небольшой пример ниже демонстрирует семейство новых методов ( parallelXxx ) в действии.

 package com.javacodegeeks.java8.parallel.arrays; import java.util.Arrays; import java.util.concurrent.ThreadLocalRandom; public class ParallelArrays < public static void main( String[] args ) < long[] arrayOfLong = new long [ 20000 ]; Arrays.parallelSetAll( arrayOfLong, index ->ThreadLocalRandom.current().nextInt( 1000000 ) ); Arrays.stream( arrayOfLong ).limit( 10 ).forEach( i -> System.out.print( i + " " ) ); System.out.println(); Arrays.parallelSort( arrayOfLong ); Arrays.stream( arrayOfLong ).limit( 10 ).forEach( i -> System.out.print( i + " " ) ); System.out.println(); > > 

Этот небольшой фрагмент кода использует метод parallelSetAll() для заполнения массива 20000 случайными значениями. После этого применяется parallelSort() . Программа выводит первые 10 элементов до и после сортировки, чтобы показать, что массив действительно отсортирован. Пример вывода программы может выглядеть следующим образом (Обратите внимание, что элементы массива заданы случайным образом).

 Unsorted: 591217 891976 443951 424479 766825 351964 242997 642839 119108 552378 Sorted: 39 220 263 268 325 607 655 678 723 793 

5.7. Параллелизм

  • DoubleAccumulator
  • DoubleAdder
  • LongAccumulator
  • LongAdder

6. Новые функции в среде выполнения Java (JVM)

Область PermGen упразднена и была заменена на Metaspace (JEP 122). JVM опции -XX:PermSize и -XX:MaxPermSize были заменены на -XX:MetaSpaceSize и -XX:MaxMetaspaceSize соответственно.

7. Заключение

Будущее здесь: Java 8 продвинуло свою платформу вперед предоставив возможности, которые позволяют разработчикам быть более продуктивными. Еще слишком рано для перевода производственных систем на Java 8, но в ближайшие несколько месяцев эта адаптация должна медленно начинать расти. Тем не менее настало время для начала подготовки вашей кодовой базы для совместимости с Java 8 и быть готовым включить изменения Java 8, когда она окажется достаточно безопасной и стабильной. В качестве подтверждения принятия сообществом Java 8, недавно Pivotal был выпущен Spring Framework с production поддержкой Java 8. Вы можете внести свой вклад о захватывающих новых возможностях в Java 8 в комментариях.

8. Источники

  • What’s New in JDK 8
  • The Java Tutorials
  • WildFly 8, JDK 8, NetBeans 8, Java EE 7
  • Java 8 Tutorial
  • JDK 8 Command-line Static Dependency Checker
  • The Illuminating Javadoc of JDK 8
  • The Dark Side of Java 8
  • Installing Java™ 8 Support in Eclipse Kepler SR2
  • Java 8
  • Oracle Nashorn. A Next-Generation JavaScript Engine for the JVM

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *