Стоит ли переходить с 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, и снова она будет сосредоточена только на изменениях, которые могут повлиять на миграцию.
п
Оригинал