[Monday Commuter Radio] Сколько новых возможностей Java8-15 вы знаете?

Java задняя часть
[Monday Commuter Radio] Сколько новых возможностей Java8-15 вы знаете?

0. Прочитав эту статью, вы узнаете

  • 6 практичных новых функций Java

Всего в этой статье около 1760 слов, а время чтения примерно равно одной песне.Звони в мои колокола, Энрике Иглесиас.

С 2018 года Java приняла стратегию выпуска новых версий каждые шесть месяцев. Эта стратегия сохраняет Java свежей и сильной.В этой статье я расскажу вам о 6 практических новых функциях Java.

1. Необязательный класс

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

По сути, класс Optional позволяет вам обернуть переменную, а затем использовать методы оболочки для более лаконичного обращения с Null.

Рассмотрим сравнительный пример:

Пример 1.1. Не использовать нулевой указатель необязательного класса

public class MyClass {
    public static void main(String args[]) {
        InnerClass innerClass = null;
        // 这里对引用为null的变量进行了方法访问,产生一个NullPointerException
        System.out.println("innerClass = " + innerClass.getName());
    }
}

class InnerClass {
    String name = "";

    public String getName() {
        return this.name;
    }
}

Теперь, как мы можем использовать Optional, чтобы избежать описанной выше ситуации?

Необязательный класс имеет метод isPresent(), который вы можете использовать в качестве проверки if. Но у нас есть более короткий метод — ifPresent(), который продолжит выполнение кода только в том случае, если значение присутствует.

Пример 1.2 Использование нулевого указателя класса Optional

public class MyClass {
    public static void main(String args[]) {
        InnerClass innerClass = null;
        Optional fooWrapper = Optional.ofNullable(innerClass);
        fooWrapper.ifPresent(x -> System.out.println("innerClass = " + x.getName()));
    }
}

class InnerClass {
    String name = "";

    public InnerClass(String name) {
        this.name = name;
    }

    public String getName() {
        return this.name;
    }
}

Конечно, когда вы используете класс Optional, вы также можете использовать метод orElse() для вызова значения по умолчанию или использовать orElseGet() для предоставления ссылки на функцию.

2. Рекордный класс

Все мы знакомы с DTO (Data Transfer Object), который обычно используется для хранения и передачи данных, хранящихся в базах данных, файловых системах и т. д. Ключевое слово Record было введено в Java 14 и улучшено в Java 15.

В примере 3.1 показано, как определить DTO до введения класса Record.

Пример 3.1. Простой DTO

public class MyClass {
    public static void main(String args[]) {
        Student student = new Student("Jay", 18);
        // . . .
    }
}
class Student {
    String name;
    Integer age;
    public Student(String name, Integer age){
        this.name = name;
        this.age = age;
    }
    public String getName(){
        return this.name;
    }
    public Integer getAge(){
        return this.age;
    }
}

Мы видим, что приведенный выше пример полон подробного шаблонного кода, теперь мы можем использовать ключевое слово Record для достижения цели упрощения DTO.

Пример 3.2 Использование ключевого слова Record

public class MyClass {
    public static void main(String args[]) {
      Student student = new Student("Jay", 18);

      // . . .
    }
}

public record Student(String name, Integer age) {}

Тип Record также определяет реализации по умолчанию equals(), hashCode() и toString() и позволяет разработчикам переопределять эти реализации. Мы также можем предоставить собственный конструктор.

Также обратите внимание, что класс Record не может быть подклассом.

4. Новые строковые методы

В Java 10 и Java 12 было добавлено несколько полезных новых методов String. В дополнение к методам манипулирования строками были введены два новых метода для упрощения доступа к текстовым файлам.

4.1 Новые строковые методы в Java 10

  • isBlank(): возвращает true, если строка пуста или содержит только пробелы (включая табуляцию).
  • lines(): разбивает строку на поток строк, каждая строка содержит одну строку. Каждая строка отделяется /r или /n или /r/n.

Пример 4.1.1 строки()

import java.io.IOException;
import java.util.stream.Stream;
public class MyClass {
    public static void main(String args[]) throws IOException{
      String str = "test \ntest2 \n\rtest3 \r";
      Stream lines = str.lines();
      lines.forEach(System.out::println);
    }
}

/*
outputs:
test
test2
test3
*/
  • strip(), stripLeading(), stripTrailing(): удалить пробелы в начале и в конце, только в начале и только в конце соответственно.
  • repeat(int times): возвращает строку, взятую из исходной строки и повторяющуюся указанное количество раз.
  • readString(): чтение строки непосредственно из пути к файлу.

Пример 4.1.2. readString()

Path path = Path.of("test.txt"); 
String text = Files.readString(path);
  • writeString(Path path): Запишите строку непосредственно в файл по указанному пути.

4.2 Новые строковые методы в Java 12

  • indent(int level): добавьте или удалите пробелы в начале каждой строки строки, чтобы настроить отступ строк строки.
  • transform(Function f): применяет заданное лямбда-выражение к строке.

5. Переключение выражений

В Java 12 представлены новые выражения переключателя, которые позволяют встроенное использование переключателя внутри операторов. Другими словами, выражение переключения возвращает значение.

Java 13 пошла еще дальше и представила ключевое слово yield. Использование ключевого слова yield может напрямую выйти из текущего блока переключателей и вернуть значение.

Java 14 имеет новый синтаксис выражения переключения как полноценную функцию.

Давайте посмотрим на сходства и различия между старыми и новыми выражениями Switch.

Пример 5.1 Древний Java-переключатель

public class Test {
    public static void main(String args[]) {
        int size = 3;
        String message = "";

        switch (size) {
            case 1:
                message = "one";
                break;
            case 3:
                message = "three";
                break;
            default:
                message = "unknown";
                break;
        }

        System.out.println("The number is " + message);
    }

}

Этот код уже довольно многословен, давайте посмотрим, как мы можем его упростить.

Пример 5.2. Новый переключатель Java

public class Test {
        public static void main(String args[]) {
            int size = 3;
            var message = switch (status) {
                case 1 -> "one";
                case 2 -> "two";
                case 3 -> "three";
                default -> {
                    System.out.println("closed");
                    yield "unknown";
                }
            };
            System.out.println("The number is " + message);
        }

}

6. Text block

Java 13 решает давнюю проблему работы со сложными текстовыми строками в Java с введением текстовых блоков. Java 14 дополняет эту поддержку.

Такие вещи, как JSON, XML и SQL, сведут вас с ума многоуровневым вложенным экранированием. В Java встраивание фрагмента HTML, XML, SQL или JSON в строковый литерал обычно требует тщательного редактирования путем экранирования и конкатенации, прежде чем код, содержащий фрагмент, может быть скомпилирован. Фрагмент часто трудно читать и утомительно поддерживать.

Давайте рассмотрим следующий пример, в котором новый синтаксис текстового блока используется для создания фрагмента JSON.

Пример 6.1 JSON с использованием текстовых блоков

class TextBlock { 
  public static void main(String args[]) {
    String json = """
      {
        "name" : "Jay",
        "age" : "18"
      }
    """;

    System.out.println(json);
  }
}

В приведенном выше примере, не видя escape-символа, обратите вниманиетройные двойные кавычкисинтаксис.

7. Герметичный класс - закрытый класс

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

Значение закрытого класса заключается в том, что расширяемость может быть ограничена предсказуемым и контролируемым диапазоном через закрытый класс, который предоставляет новые возможности для проектирования и реализации интерфейса; за счет комбинации с тестированием типов класс разрешений может быть исчерпывающим. нам больше контроля над безопасностью и надежностью нашего кода.

Пример 7.1 Закрытый класс

public abstract sealed class Pet
    permits Cat, Dog, Bird {...}

В приведенном выше примере мы использовали запечатанное ключевое слово, чтобы указать, какие классы могут расширять класс Pet.

8. Заключение

Вышеизложенное — это мой краткий обзор шести практических новых функций Java, понимаете?

Спасибо за просмотр этого выпускаЙи Джун@Monday Commuter Radio. Если вы думаете, что это неплохо, поддержите меня три раза подряд, увидимся в следующий раз.