Стоит ли переходить с Java 6 на Java 8?

Стоит ли переходить с Java 6 на Java 8?

15 июня 2023 г.

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

Java 6 → Java 8

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

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

Если вы спросите любого Java-разработчика о переходе с Java 6 на Java 8, первое, что вы, вероятно, услышите, это лямбда-выражения. Действительно, лямбда-выражения — самая заметная веха в Java. Выражения Lamba не только могут сделать ваш код более кратким, что позволит вам больше не использовать анонимные классы, но и станут отправной точкой для реализации функциональных интерфейсов и ссылок на методы. Давайте сравним код:

Java 6. Анонимный класс:

Comparator<Integer> intComparator = new Comparator<Integer>() {
    @Override
    public int compare(Integer i1, Integer i2) {
        return i1.compareTo(i2);
    }
};

Java 8. Выражение Lamba:

Comparator<Integer> intComparator = (Integer i1, Integer i2) -> i1.compareTo(i2);

Так, в данном конкретном примере лямбда-выражения сократили количество строк с 6 до 1. Это изменение может резко сократить количество строк кода в реальных проектах; это приводит к более лаконичному и читабельному коду, что, несомненно, облегчает его поддержку. Используя ссылку на метод, вы можете сделать свой код еще более лаконичным:

Java 8. Ссылка на метод:

Comparator<Integer> intComparator = Integer::compareTo;

API даты и времени

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

Java 6. Дата:

Date today = new Date();
int currentYear = today.getYear()+1900;
int currentMonth = today.getMonth()+1;

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

Java 8. Локальная дата:

LocalDate today = LocalDate.now();
int year = today.getYear();
Month month = today.getMonth();

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

Методы по умолчанию

Еще одно полезное нововведение в Java 8 — методы по умолчанию для интерфейсов. Методы по умолчанию позволяют добавлять функциональность по умолчанию для интерфейсов, что практически сводит на нет разницу между интерфейсами и абстрактными классами. Это было сделано не просто так. Были добавлены официально методы по умолчанию, чтобы сохранить совместимость со старым кодом. Таким образом, их можно использовать для добавления функциональности по умолчанию в любой класс, реализующий интерфейс с методом по умолчанию:

public interface SummingInterface {

        default int sumOfLowestAndHighest() {
            return takeHighestValue() + takeLowestValue();
        }

        int takeLowestValue();
        int takeHighestValue();
    }

Еще один прием — предоставить более краткое имя метода. Он хорошо работает, когда речь идет об использовании многословных методов JPA:

public interface JpaInterface {

    default List<FooBarRecord> findValuesBetween(int foo, int bar) {
        return findByFooInAndBarWhereBarLessOrEqualsAndFooGreaterOrEquals(foo, bar);

    }

API потоковой передачи

Последняя привлекательная функция Java 8 — Stream API. API привносит в Java функциональный стиль программирования, когда речь идет об управлении коллекциями. Это упрощает выполнение таких операций, как фильтрация, сопоставление и сбор в новую коллекцию, что, в свою очередь, делает код более надежным, кратким и безошибочным. Давайте рассмотрим простой пример поиска наименьшего значения, но не больше 100:

Java 6. Классический обход:

Integer result = Integer.MIN_VALUE;
for (Integer value : integers) {
    if (value < 100 && value > result) {
        result = value;
    }
}
return result;

Java 8. Потоковый API:

return integers.stream()
        .filter(integer -> integer < 100)
        .max(Integer::compareTo)
        .orElse(Integer.MIN_VALUE);

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


Вердикт

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

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

п


Оригинал
PREVIOUS ARTICLE
NEXT ARTICLE