Новые функции Java 11

JavaJavaBeginner
Практиковаться сейчас

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

Введение

Java 11 был выпущен в сентябре 2018 года, и он ввел многие новые функции и изменения в платформе. В этом лабе вы познакомитесь с процессом запуска работы с Java 11 и изучите его новые функции.

Настройка среды

Во - первых, убедитесь, что на вашей системе установлен JDK 11. Вы можете проверить это, выполнив следующую команду в терминале:

java -version

Если Java 11 не установлен, вы можете скачать его с сайта Oracle или использовать менеджер пакетов, такой как apt - get или yum.

После настройки JDK создайте Java - файл с помощью следующей команды:

mkdir -p ~/project && cd ~/project
touch MyFirstJavaProgram.java

Теперь, когда Java - файл создан, откройте его в своем любимом текстовом редакторе.

touch MyFirstJavaProgram.java

Запуск Java - файлов

До Java 11 нам приходилось компилировать Java - файл с помощью команды javac, а затем запускать его с помощью команды java. С Java 11 мы можем напрямую запускать Java - файл с помощью только команды java.

В файле MyFirstJavaProgram.java добавьте следующий код:

public class MyFirstJavaProgram {
    public static void main(String[] args) {
        System.out.println("Hello, Java 11!");
    }
}

Сохраните файл и запустите его с помощью следующей команды:

java MyFirstJavaProgram.java

На консоли должно появиться сообщение "Hello, Java 11!".

Новые методы класса String

Java 11 ввел некоторые новые методы в класс String. В этом шаге мы рассмотрим эти новые методы.

Метод isBlank()

Метод isBlank() используется для проверки, является ли строка пустой или нет. Пустая строка или строка, содержащая только пробелы, считается пустой.

В файле MyFirstJavaProgram.java добавьте следующий код:

String s1 = "";
String s2 = "    ";
String s3 = "String";

System.out.println("s1 is blank: " + s1.isBlank());
System.out.println("s2 is blank: " + s2.isBlank());
System.out.println("s3 is blank: " + s3.isBlank());

Сохраните файл и запустите его с помощью следующей команды:

javac MyFirstJavaProgram.java
java MyFirstJavaProgram

Вы должны увидеть следующий вывод:

s1 is blank: true
s2 is blank: true
s3 is blank: false
Методы strip(), stripLeading() и stripTrailing()

Методы strip(), stripLeading() и stripTrailing() используются для удаления пробелов из строки. Они похожи на существующий метод trim(), но обеспечивают поддержку Unicode.

В файле MyFirstJavaProgram.java добавьте следующий код:

String s = "   String   ";
System.out.println("$" + s + "$");
System.out.println("$" + s.strip() + "$");
System.out.println("$" + s.stripLeading() + "$");
System.out.println("$" + s.stripTrailing() + "$");

Сохраните файл и запустите его с помощью следующей команды:

javac MyFirstJavaProgram.java
java MyFirstJavaProgram

Вы должны увидеть следующий вывод:

$   String   $
$String$
$String   $
$   String$

Доступ к элементам управления на основе вложения

Java 11 представило новую функцию, которая позволяет нам получать доступ к приватным членам вложенного класса с использованием Reflection API. В этом шаге мы рассмотрим эту новую функцию.

В файле MyFirstJavaProgram.java добавьте следующий код:

public class Demo {
    private void privateMethod() {
        System.out.print("Private Method");
    }
    class NestedClass {
        public void callPrivateMethod() {
            privateMethod();
        }
    }
    public static void main(String[] args) {
        System.out.println(Demo.class.isNestmateOf(Demo.NestedClass.class));
        System.out.println(Demo.NestedClass.class.isNestmateOf(Demo.class));
        System.out.println(Demo.NestedClass.class.getNestHost());
        System.out.println(Arrays.toString(Demo.class.getNestMembers()));
    }
}

Сохраните файл и запустите его с помощью следующей команды:

javac MyFirstJavaProgram.java
java MyFirstJavaProgram

Вы должны увидеть следующий вывод:

true
true
class Demo
[class MyFirstJavaProgram$Demo$NestedClass]

Новые методы класса Files

Java 11 ввел некоторые новые методы в класс Files, которые упрощают чтение и запись строк. В этом шаге мы рассмотрим эти новые методы.

В файле MyFirstJavaProgram.java добавьте следующий код:

import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;

public class Demo {
    public static void main(String[] args) throws IOException {
        Path path = Files.createTempFile("temporaryFile", ".txt");
        //Writing to the file
        Files.writeString(path, "Hello World");
        //Reading from the file
        String s = Files.readString(path);
        System.out.print(s);
    }
}

Сохраните файл и запустите его с помощью следующей команды:

javac MyFirstJavaProgram.java
java MyFirstJavaProgram

Вы должны увидеть следующий вывод:

Hello World

Преобразование коллекции в массив

Java 11 представило новый метод по умолчанию toArray(), который упрощает преобразование коллекции в массив соответствующего типа.

В файле MyFirstJavaProgram.java добавьте следующий код:

import java.util.ArrayList;
import java.util.Arrays;

public class Demo {
    public static void main(String[] args) {
        ArrayList<Integer> list = new ArrayList<>();
        list.add(5);
        list.add(10);
        list.add(15);

        Integer[] intArr = list.toArray(Integer[]::new);
        System.out.print(Arrays.toString(intArr));
    }
}

Сохраните файл и запустите его с помощью следующей команды:

javac MyFirstJavaProgram.java
java MyFirstJavaProgram

Вы должны увидеть следующий вывод:

[5, 10, 15]

Метод not()

Java 11 ввел новый метод not() в интерфейсе Predicate, который используется для отрицания предиката. В этом шаге мы рассмотрим эту функцию.

В файле MyFirstJavaProgram.java добавьте следующий код:

import java.util.Arrays;
import java.util.List;
import java.util.function.Predicate;
import java.util.stream.Collectors;

public class Demo {
    public static void main(String[] args) {
        Predicate<String> startWithZ = s -> s.charAt(0) == 'z';
        Predicate<String> doesNotStartWithZ = Predicate.not(startWithZ);

        List<String> list = Arrays.asList("za", "zq", "az", "aq", "zz");
        List<String> strsStartingWithZ = list.stream()
              .filter(startWithZ)
              .collect(Collectors.toList());
        List<String> strsNotStartingWithZ = list.stream()
              .filter(doesNotStartWithZ)
              .collect(Collectors.toList());

        System.out.println(strsStartingWithZ);
        System.out.println(strsNotStartingWithZ);
    }
}

Сохраните файл и запустите его с помощью следующей команды:

javac MyFirstJavaProgram.java
java MyFirstJavaProgram

Вы должны увидеть следующий вывод:

[za, zq, zz]
[az, aq]

HTTP-клиент

API HTTP-клиента было представлено в Java 9 и стало стандартным в Java 11. В этом шаге мы рассмотрим, как использовать новое API HTTP-клиента.

В файле MyFirstJavaProgram.java добавьте следующий код:

import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import java.nio.charset.StandardCharsets;

public class Demo {
    public static void main(String[] args) throws Exception {
        HttpClient client = HttpClient.newHttpClient();
        HttpRequest request = HttpRequest.newBuilder()
             .uri(new URI("https://www.google.com"))
             .GET()
             .build();
        HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString(StandardCharsets.UTF_8));
        System.out.println(response.body());
    }
}

Сохраните файл и запустите его с помощью следующей команды:

javac MyFirstJavaProgram.java
java MyFirstJavaProgram

В консоли вы должны увидеть HTML-код главной страницы Google.

Синтаксис локальных переменных для лямбда-выражений

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

В файле MyFirstJavaProgram.java добавьте следующий код:

import java.util.function.Predicate;

public class Demo {
    public static void main(String[] args) {
        Predicate<String> startsWithZ = (@NotNull var str) -> str.charAt(0) == 'z';
        System.out.println(startsWithZ.test("zoo"));
    }
}

Сохраните файл и запустите его с помощью следующей команды:

javac MyFirstJavaProgram.java
java MyFirstJavaProgram

В консоли должно быть напечатано true.

Глобальный сборщик мусора Epsilon

Java 11 представила новый экспериментальный функционал, называемый глобальным сборщиком мусора Epsilon, который выделяет память, но никогда не собирает мусор. В этом шаге мы рассмотрим этот экспериментальный функционал.

В файле MyFirstJavaProgram.java добавьте следующий код:

public class Demo {
    public static void main(String[] args) {
        byte[] b = new byte[1024 * 1024 * 1024];
        System.out.println("Allocated 1GB of memory");
    }
}

Сохраните файл и запустите его с помощью следующей команды:

java -XX:+UnlockExperimentalVMOptions -XX:+UseEpsilonGC MyFirstJavaProgram.java

В консоли должно быть напечатано "Allocated 1GB of memory", за которым следует завершение программы с кодом 0.

Резюме

В этом практическом занятии вы узнали о новых функциях, представленных в Java 11, в том числе новых методах класса String, контроле доступа на основе вложенности, новых методах работы с файлами и других. Также вы узнали, как использовать новый API HTTP-клиента и глобальный сборщик мусора Epsilon. Теперь вы должны иметь более глубокое понимание Java 11 и его возможностей.