Java11 официально выпущен, что делает ваш код более совершенным?

Java задняя часть .NET Oracle

Тематическое взаимодействие

Вышла Java11, давайте поговорим о том, что у вас есть на сегодняшний деньНа какой версии вы остановилисьШерстяная ткань? Всем за быстрый выпуск новых версийЧто вы хотите сказать??

25 сентября Oralce официально выпустила Java 11, первую долгосрочную версию, поддерживаемую после Java 8.

Мы все знаем, что предыдущие версии не имели долгосрочной поддержки, однако имеет смысл выпустить эту последнюю версию с долгосрочной поддержкой сейчас.

В Java 11 также добавлено много новых функций, некоторые функции, конечно, удалены.

Вот дата выпуска java-версии:

5954965-80173492f7a44cc1.jpg

java11 также обновляется из следующих мест (ниже скриншот официального сайта)

搜狗截图20180928195041.jpg

搜狗截图20180928195105.jpg

Поскольку Java11 интегрировала некоторые функции Java9 и Java10 в Java11, давайте представим некоторые новые функции.

Новый синтаксис и API, представленные в Java 9-11

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

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

До Java 10 вам нужно было объявить объект String таким образом.

String str="hello java 9";

В Java 10 вы можете использовать var вместо String, и выражение станет таким:

var str="hello java 10";

Переменные, объявленные с помощью var, по-прежнему имеют статический тип. Несовместимые типы не могут быть переназначены таким переменным. Этот фрагмент кода не компилируется:

var str="hello java 11";
str=11;  //Incompatible types

var также не допускается, если компилятор не может определить правильный тип переменной. Все следующие примеры кода приводят к ошибке компилятора:

// Cannot 	 infer type:
var a;
var nothing =null;
var  lambda=()->System.out.prinltn("Pity!");
var method=this::someNethod;

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

var myList = new ArrayList<Map<String,List<Integer>>>();
for(var current:myList)
{
	//Current is infered to type:Map<String,List<Integer>>
	System.out.println(current);
}

Начиная с Java 11 ключевое слово var также разрешено для лямбда-параметров:

Predicate<String>predicate = (@Nullable var a)->true;

HTTP Client

В Java 9 появился HttpClient API для обработки HTTP-запросов. Начиная с Java 11 этот API официально вошел в стандартный пакет библиотек (java.net). Давайте посмотрим, что мы можем сделать с этим API.

Новый HttpClient можно использовать синхронно или асинхронно. Синхронные запросы блокируют текущий поток. BodyHandlers определяют ожидаемый тип тела ответа (например, строка, массив байтов или файл):

var request = HttpRequest.newBuilder()
    .uri(URI.create("https://winterbe.com"))
    .GET()
    .build();
var client = HttpClient.newHttpClient();
HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
System.out.println(response.body());

Тот же запрос можно выполнить и с помощью async. Вызов sendAsync не блокирует текущий поток, но возвращает CompletableFuture для асинхронных операций.

var request = HttpRequest.newBuilder()
    .uri(URI.create("https://winterbe.com"))
    .build();
var client = HttpClient.newHttpClient();
client.sendAsync(request, HttpResponse.BodyHandlers.ofString())
    .thenApply(HttpResponse::body)
    .thenAccept(System.out::println);

Мы можем опустить .GET(), так как это метод запроса по умолчанию.

В следующем примере данные отправляются на указанный URL-адрес через POST. Подобно BodyHandler, вы используете BodyPublishers для определения типа данных, отправляемых в качестве тела запроса, например строки, массива байтов, файла или входного потока:

var request = HttpRequest.newBuilder()
    .uri(URI.create("https://postman-echo.com/post"))
    .header("Content-Type", "text/plain")
    .POST(HttpRequest.BodyPublishers.ofString("Hi there!"))
    .build();
var client = HttpClient.newHttpClient();
var response = client.send(request, HttpResponse.BodyHandlers.ofString());
System.out.println(response.statusCode());      // 200

В последнем примере показано, как выполнить авторизацию через BASIC-AUTH:

var request = HttpRequest.newBuilder()
    .uri(URI.create("https://postman-echo.com/basic-auth"))
    .build();
var client = HttpClient.newBuilder()
    .authenticator(new Authenticator() {
        @Override
        protected PasswordAuthentication getPasswordAuthentication() {
            return new PasswordAuthentication("postman", "password".toCharArray());
        }
    })
    .build();
var response = client.send(request, HttpResponse.BodyHandlers.ofString());
System.out.println(response.statusCode());      // 200

Collections

Такие коллекции, как List, Set и Map, были дополнены новыми методами. List.of создает новый неизменяемый список из заданных аргументов. List.copyOf создает неизменяемую копию списка.

var list = List.of("A", "B", "C");
var copy = List.copyOf(list);
System.out.println(list == copy);   // true

Поскольку список уже является неизменяемым, на самом деле нет необходимости создавать копию экземпляра списка, поэтому список и копия являются одним и тем же экземпляром. Однако, если вы скопируете изменяемый список, копия создаст новый экземпляр, поэтому при изменении исходного списка не гарантируются побочные эффекты:

var list = new ArrayList<String>();
var copy = List.copyOf(list);
System.out.println(list == copy);   // false

При создании неизменяемой карты вам не нужно создавать записи карты самостоятельно, а передать ключ и значение в качестве параметров:

var map = Map.of("A", 1, "B", 2);
System.out.println(map);    // {B=2, A=1}

Неизменяемые коллекции в Java 11 по-прежнему используют старый интерфейс Collection API. Однако если вы попытаетесь изменить неизменяемую коллекцию, будет выдано исключение java.lang.UnsupportedOperationException. Хорошей новостью является то, что Intellij IDEA выдаст предупреждение, если вы попытаетесь изменить неизменяемую коллекцию.

Streams

Потоки были представлены в Java 8, а в Java 9 добавлено три новых метода. Конструктор с одним параметром:

Stream.ofNullable(null)
    .count()   // 0

Добавлены методы takeWhile и dropWhile для освобождения элементов из потока:

Stream.of(1, 2, 3, 2, 1)
    .dropWhile(n -> n < 3)
    .collect(Collectors.toList());  // [3, 2, 1]

Stream.of(1, 2, 3, 2, 1)
    .takeWhile(n -> n < 3)
    .collect(Collectors.toList());  // [1, 2]

Если вы не знакомы с Stream, вы можете обратиться к этой статье [1].

Optionals

Необязательные параметры предоставляют некоторые очень удобные функции, например, теперь вы можете просто преобразовать необязательный элемент в поток или предоставить другой необязательный элемент в качестве резервной копии для пустого дополнительного элемента:

Optional.of("foo").orElseThrow();     // foo
Optional.of("foo").stream().count();  // 1
Optional.ofNullable(null)
    .or(() -> Optional.of("fallback"))
    .get();                           // fallback

Strings

Java 11 добавляет в String несколько вспомогательных методов для обрезки или проверки наличия пробелов и т. д.:

" ".isBlank();                // true
" Foo Bar ".strip();          // "Foo Bar"
" Foo Bar ".stripTrailing();  // " Foo Bar"
" Foo Bar ".stripLeading();   // "Foo Bar "
"Java".repeat(3);             // "JavaJavaJava"
"A\nB\nC".lines().count();    // 3

InputStreams

InputStream добавляет метод transferTo, который можно использовать для передачи данных напрямую в OutputStream:

var classLoader = ClassLoader.getSystemClassLoader();
var inputStream = classLoader.getResourceAsStream("myFile.txt");
var tempFile = File.createTempFile("myFileCopy", "txt");
try (var outputStream = new FileOutputStream(tempFile)) {
    inputStream.transferTo(outputStream);
}

Эти новые функции, указанные выше, доступны только в предыдущих версиях или некоторые новые функции, которые довольно хороши.Если вы хотите узнать больше о новых функциях, вы можете перейти на официальный сайт, чтобы проверить (docs.Oracle.com/en/java/ только что…

Или посмотрите ссылку ниже

Использованная литература:

Для получения дополнительной информации отсканируйте приведенный ниже QR-код, чтобы подписаться на нашу общедоступную учетную запись WeChat, и каждый день отправляйте свежую информацию и галантерею!

Обратите внимание на публичный аккаунт WeChat «Изучайте java хорошо», галантерея обновляется ежедневно!