Java 8 содержит множество действительно интересных функций как на уровне JVM, так и на уровне языков. В то время как некоторые функции, первоначально предназначенные для этого выпуска, были ограничены или выпущены в выпуске 9, существуют буквально десятки новых функций. Многие из новых дополнений являются скрытыми улучшениями на уровне компилятора, JVM или справочной системы. Таким образом, хотя мы можем извлечь из них пользу, нам ничего не нужно активно делать (кроме, конечно, установки Java 8), чтобы наслаждаться ими.
Сказав это, давайте рассмотрим 5 функций, которые, по нашему мнению, абсолютно необходимы для вас:
1. Лямбда-выражения
Даже если мы действительно не хотим идти в мейнстрим, нет никаких сомнений в том, что с точки зрения разработчика, наиболее доминирующей особенностью Java 8 является новая поддержка лямбда-выражений. Это дополнение к языку выводит Java на передний план функционального программирования, наряду с другими функциональными языками на основе JVM, такими как Scala и Clojure.
Ранее мы рассматривали, как в Java реализованы лямбда-выражения , и как они сравниваются с подходом, принятым в Scala. С точки зрения Java, это одно из самых больших дополнений к языку за последнее десятилетие.
Как минимум, рекомендуется ознакомиться с синтаксисом Lambda, особенно в том, что касается операций с массивами и коллекциями, где Lambdas были тесно интегрированы в базовые языковые библиотеки. Весьма вероятно, что вы начнете видеть все больше и больше кода, подобного приведенному ниже фрагменту кода, как в третьей стороне, так и в коде вашей организации.
1
2
|
Map<Person.Sex, List<Person>> byGender = roster.stream().collect(Collectors.groupingBy(Person::getGender)); |
* Довольно эффективный способ группировки коллекции по значению поля определенного класса.
2. Параллельные операции
С добавлением лямбда-выражений к операциям с массивами Java ввела ключевое понятие в язык внутренней итерации. По сути, как разработчики, мы привыкли использовать циклические операции в качестве одной из самых основных идиом программирования, прямо здесь с if и else.
Введение лямбда-выражений перевернуло эту парадигму с фактической итерацией по коллекции, к которой применяется лямбда-функция, теперь выполняемой самой базовой библиотекой (то есть внутренней итерацией).
Вы можете думать об этом как о расширении итераторов, когда фактическая операция извлечения следующего элемента из коллекции, с которой нужно работать, выполняется итератором. Захватывающая возможность, открываемая этим шаблоном проектирования, состоит в том, чтобы позволить операциям, выполняемым над длинными массивами, таким как сортировка, фильтрация и отображение, параллельно выполнять платформу. При работе с серверным кодом, который обрабатывает длительные коллекции на постоянной основе, это может привести к значительному повышению пропускной способности при относительно небольшой работе с вашей стороны.
Вот тот же фрагмент, что и выше, но с использованием новых возможностей параллельной обработки платформы —
1
2
3
|
ConcurrentMap<Person.Sex, List<Person>> byGender = roster.parallelStream().collect( Collectors.groupingByConcurrent(Person::getGender)); |
* Это довольно небольшое изменение, необходимое для запуска этого алгоритма в нескольких потоках.
3. Java + JavaScript = ❤
Java 8 пытается исправить одну из своих самых больших исторических ошибок — постоянно растущее расстояние между Java и JavaScript, которое только увеличивалось в последние несколько лет. В этом новом выпуске Java 8 представляет совершенно новый движок JVM JavaScript — Nashorn. Этот механизм уникальным образом использует некоторые из новых функций, представленных в Java 7, таких как invokeDynamic, чтобы обеспечить скорость на уровне JVM для выполнения JavaScript прямо там, как V8 и SpiderMonkey.
Это означает, что в следующий раз, когда вы захотите интегрировать JS в свой бэкэнд, вместо настройки экземпляра node.js, вы можете просто использовать JVM для выполнения кода. Дополнительным бонусом здесь является возможность беспрепятственного взаимодействия между вашим кодом Java и JavaScript в процессе, без необходимости использовать различные методы IPC / RPC для преодоления разрыва.
4. Новые API даты / времени
Сложность текущего нативного API библиотеки Java была причиной боли для разработчиков Java на протяжении многих лет. Время Joda заполняло этот вакуум уже много лет, и с Java 8. Сразу возник вопрос, почему Java 8 не приняла Joda в качестве своей собственной структуры времени. Из-за того, что в Joda было воспринято как недостаток дизайна, в Java 8 был реализован собственный новый API даты / времени с нуля. Хорошей новостью является то, что в отличие от Calendar.getInstance (), новые API были разработаны с учетом простоты и понятных операций для работы с манипулируемыми значениями как в удобочитаемом, так и в машинном формате.
5. Параллельные аккумуляторы
Одним из наиболее распространенных сценариев в параллельном программировании является обновление числовых счетчиков, к которым обращаются несколько потоков. За эти годы было сделано много идиом, начиная с синхронизированных блоков (которые привносят высокий уровень конкуренции), до блокировок чтения / записи для AtomicInteger (ов). Хотя последние являются более эффективными, так как они напрямую зависят от инструкций процессора CAS, они требуют более высокой степени знакомства для правильной реализации требуемой семантики.
В Java 8 эта проблема решается на уровне платформы с новыми классами параллельных аккумуляторов, которые позволяют очень эффективно увеличивать / уменьшать значение счетчика в поточно-ориентированном режиме. Это действительно тот случай, когда речь идет не о вкусе или предпочтениях — использование этих новых классов в вашем коде действительно просто.
Есть ли какие-то другие языковые функции, о которых, по вашему мнению, должен знать каждый разработчик? Добавьте их в разделе комментариев.
Ссылка: | 5 функций в Java 8, которые изменят ваш код от нашего партнера по JCG Тала Вейса из блога Takipi . |