От Java 8 до Java 14, как изменился способ написания кода?

Java

Несколько дней назад JDK 14 был официально выпущен, а новая версия вышел на этот раз, содержит 16 новых функций.

На самом деле, от Java8 до Java14 действительно изменился способ написания кода программистами, особенность не так много, в этой статье мы рассмотрим, что есть.

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

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

Синтаксис лямбда-выражения следующий:

(parameters) -> expression
或
(parameters) ->{ statements; }

Например, следующий пример:

// 1. 不需要参数,返回值为 5  
() -> 5  

// 2. 接收一个参数(数字类型),返回其2倍的值  
x -> 2 * x  

// 3. 接受2个参数(数字),并返回他们的差值  
(x, y) -> x – y  

// 4. 接收2个int型整数,返回他们的和  
(int x, int y) -> x + y  

// 5. 接受一个 string 对象,并在控制台打印,不返回任何值(看起来像是返回void)  
(String s) -> System.out.print(s)

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

Streams API

В дополнение к лямбда-выражениям в Java 8 был представлен Stream API, который, наконец, выводит Java на подножку функционального программирования.

Поток использует аналогичный интуитивно понятный способ использовать операторы SQL из данных запроса базы данных, чтобы обеспечить более высокий уровень абстракции для Java и установить эксплуатацию операций.

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

Как показано на рисунке ниже, ряд операций выполняется над коллекцией через Stream API:

List<String> strings = Arrays.asList("Hollis", "HollisChuang", "hollis", "Hello", "HelloWorld", "Hollis");
Stream s = strings.stream().filter(string -> string.length()<= 6).map(String::length).sorted().limit(3)
            .distinct();

Более того, Stream также поддерживает параллельные потоки, что намного лучше по производительности, чем традиционные циклы for. (Подробное использование: "Элегантная поза для работы с коллекциями в Java 8 — Stream")

Прошло 6 лет с момента появления лямбда-выражений и Stream API, и я думаю, что многие люди использовали эти возможности в своей работе.

Хотя многие люди по-разному относятся к использованию этих двух грамматик, автор все же считает, что эта функция очень полезна, но не стоит использовать сверхдлинные потоковые операции, слишком «выпендриваясь» при ежедневном написании кода.Читаемость кода не должна быть слишком низким.

Новый API даты и времени

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

Таким образом, Java 8 еще больше улучшает обработку даты и времени, выпуская новый API Date-Time (JSR 310).

Новый пакет java.time охватывает все операции, связанные с датами, временем, датой/временем, часовыми поясами, моментами времени, временем и часами.

Общие операции следующие:

// 获取当前的日期时间
LocalDateTime currentTime = LocalDateTime.now();
System.out.println("当前时间: " + currentTime);

// 时间比较
LocalDate today = LocalDate.now();
LocalDate date1 = LocalDate.of(2014, 01, 14);
if(date1.equals(today)){} 

// 时间增加
LocalTime time = LocalTime.now();
LocalTime newTime = time.plusHours(2); // adding two hours

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

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

В версиях до Java 10 мы хотели определить при определении локальных переменных. Нам нужно указать явный тип в левой части присваивания и тип реализации в правой части присваивания:

MyObject value = new MyObject();

В Java 10 предусмотрена функция вывода типа локальной переменной, и переменные можно объявлять через var:

var value = new MyObject();

Вывод типа локальной переменной введет ключевое слово "var" без необходимости явного указания типа переменной.

По сути, так называемое определение типа локальной переменной также является синтаксическим сахаром, предоставляемым Java 10 разработчикам. Хотя мы используем var для определения его в коде, он не знает этот var для виртуальной машины.В процессе компиляции java-файла в файл класса он будет де-сахарить и использовать реальный тип переменной для замены вар (Я декомпилировал вывод типа локальной переменной Java 10)

Переключить выражение

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

В более поздней версии Java 14 эта функция была официально предоставлена ​​как стандартная функция.

Раньше возвращать содержимое в switch было довольно проблематично, общий синтаксис выглядит следующим образом:

int i;
switch (x) {
    case "1":
        i=1;
        break;
    case "2":
        i=2;
        break;
    default:
        i = x.length();
        break;
}

Используйте следующий синтаксис в JDK13:

int i = switch (x) {
    case "1" -> 1;
    case "2" -> 2;
    default -> {
        int len = args[1].length();
        yield len;
    }
};

или

int i = switch (x) {
    case "1": yield 1;
    case "2": yield 2;
    default: {
        int len = args[1].length();
        yield len;
    }
};

После этого в switch есть еще одно ключевое слово для выхода из блока switch — yield, которое используется для возврата значения. Разница с return заключается в том, что return будет напрямую выходить из текущего цикла или метода, тогда как yield будет выходить только из текущего блока switch.

Text Blocks

Функция предварительного просмотра текстовых блоков доступна в Java 13, а предварительный просмотр второй версии доступен в Java 14.

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

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

 <html>
  <body>
      <p>Hello, world</p>
  </body>
</html>

Скопированный в строку Java, он отобразит следующее:

"<html>\n" +
"    <body>\n" +
"        <p>Hello, world</p>\n" +
"    </body>\n" +
"</html>\n";

То есть она автоматически экранируется. Такая строка кажется не очень интуитивной. В JDK 13 можно использовать следующий синтаксис:

"""
<html>
  <body>
      <p>Hello, world</p>
  </body>
</html>
""";

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

Например, общие операторы SQL:

String query = """
    SELECT `EMP_ID`, `LAST_NAME` FROM `EMPLOYEE_TB`
    WHERE `CITY` = 'INDIANAPOLIS'
    ORDER BY `EMP_ID`, `LAST_NAME`;
""";

Это выглядит более интуитивно понятным и освежающим.

Records

В Java 14 включена новая функция: EP 359: записи,

Целью Records является расширение синтаксиса языка Java. Records предоставляет компактный синтаксис для объявления классов для создания класса, который представляет собой «поля, просто поля, ничего, кроме полей». Делая такое объявление в классе, компилятор может автоматически создавать все методы и использовать все поля в таких методах, как hashCode() . Это предварительная функция в JDK 14.

Запись может быть определена с помощью ключевого слова записи:

record Person (String firstName, String lastName) {}

Record решает распространенную проблему использования классов в качестве оболочек данных. Чистые классы данных резко сокращаются с нескольких строк кода до одной строки кода. (Видеть:Выпущена Java 14, можете ли вы определять классы без использования «класса»? И я собираюсь убить Ломбока!)

Суммировать

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

Я не знаю, заметили ли вы, что некоторые функции, представленные в последних версиях, делают такие языки, как Java и Kotlin, все более и более похожими...

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

Та же фраза: версия на ваше усмотрение, я использую Java 8, но нам еще предстоит разобраться в новых возможностях.