Java SE 15 была выпущена в сентябре 2020 года с набором функций, но все же функции Java 8 являются одними из самых важных.

Недавно, в сентябре 2020 года, была выпущена Java SE 15 с набором функций. Вероятно, новая версия снова появится в марте 2021 года, согласно официальному блогу Oracle. Но все же 18 марта 2014 года стал одним из самых важных дней в истории Java, когда была выпущена версия 8. Возможности версии 8 изменили способ программирования разработчиков на Java. Даже сегодня Java-разработчика спрашивают о возможностях Java 8.

Отказ от ответственности: Oracle больше не предоставляет бесплатную поддержку для Java 8. AdoptOpenJDK будет предоставлять бесплатные общедоступные обновления для своей версии Java 8 как минимум до сентября 2023 г., Oracle уже прекратила бесплатную поддержку для своих JDK. Следовательно, новый разработчик Java должен начать с OpenJDK 11.

Лямбда-выражения

Это была самая ожидаемая функция Java 8. Но почему? Просто потому, что он приблизил Java к функциональному программированию. Функциональные интерфейсы были введены в Java 8. Интерфейсы, имеющие только один абстрактный метод, являются функциональным интерфейсом. @FunctionalInterface добавлена ​​аннотация, чтобы мы могли пометить интерфейс как функциональный.

В приведенном выше примере вы можете видеть, что класс LambdaExample использует интерфейс WishingInterface, имеющий один абстрактный метод. Если интерфейс аннотирован аннотацией @FunctionalInterface, и мы пытаемся использовать более одного абстрактного метода, это вызывает ошибку компилятора.

Лямбда-выражения позволяют миру объектно-ориентированного программирования Java работать с функциональным программированием. Он обеспечивает реализацию интерфейса с функциональным интерфейсом. Когда используются лямбда-функции, нам не нужно определять метод, предоставляя реализацию. Фактически, лямбда-выражения рассматриваются как функция.

Основной синтаксис лямбда-выражения: (аргумент) → (тело).

Функциональные интерфейсы

Как упоминалось ранее, до Java 8 мы не могли использовать функциональное программирование в строго объектно-ориентированном мире. Нам пришлось создать анонимные объекты внутреннего класса или реализовать интерфейсы, такие как Runnable, ActionListener, Comparable, который - это некоторые из примеров функциональных интерфейсов.

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

В аннотации @FunctionalInterface JVM говорится, что интерфейс может иметь только один абстрактный метод. Функциональный интерфейс может иметь любое количество методов по умолчанию.

методы по умолчанию в интерфейсах

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

Например, stream () - это метод по умолчанию, добавленный в интерфейс Collection. Если бы stream () был бы добавлен как абстрактный метод, все классы, реализующие интерфейс Collection, должны были бы определять stream (), что вызвало бы раздражение разработчиков. Поскольку stream () является методом по умолчанию, все классы, реализующие интерфейс Collection, наследуют реализацию по умолчанию.

Методы по умолчанию могут вызвать проблему с алмазом

Ага. Это может случится. Абстрактные классы и интерфейсы теперь стали очень похожими. Оба могут содержать абстрактные методы и методы с реализациями, хотя синтаксис отличается. По-прежнему есть некоторые различия (например, абстрактные классы могут иметь поля экземпляров, а интерфейсы не могут), но эти различия поддерживают центральный момент: с момента выпуска Java 8 у нас есть несколько наследований (через интерфейсы), которые могут содержать код.

Наследование от разных интерфейсов нескольких методов по умолчанию с одинаковой сигнатурой и разными реализациями является проблемой. Это вызовет знаменитую Алмазную проблему. Решение состоит в том, чтобы просто заменить метод по умолчанию собственной реализацией.

статические методы в интерфейсе

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

Java Stream API

Stream API используется для обработки коллекций объектов. Он использует потоки, которые могут выполнять агрегированные операции с данными, возвращаемыми из коллекций, и операций ввода-вывода. Операции с потоками бывают либо промежуточными (он возвращает сам поток для дальнейших операций), либо терминальными (возвращает результат определенного типа). Потоки включают в себя то, что называется Параллельное выполнение операций, что значительно повышает производительность кода.

Чтобы объяснить параллельное выполнение операций, позвольте мне проиллюстрировать это на примере.

Как показано в двух примерах, подсчет коллекции с использованием традиционных методов выполняет итерацию по списку, проверяет условие и затем выводит результат. При подсчете коллекции с использованием потоков метод stream () возвращает поток всех имен, метод filter () возвращает другой поток имен длиной более 5, метод count () сводит этот поток к результату. Все эти операции происходят параллельно. Это удобно, когда в коллекции тысячи записей, потоки выводят результат за меньшее время, тем самым повышая производительность.

Дополнительный класс

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

Мои последние мысли

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