Тематическое взаимодействие
Вышла Java11, давайте поговорим о том, что у вас есть на сегодняшний деньНа какой версии вы остановилисьШерстяная ткань? Всем за быстрый выпуск новых версийЧто вы хотите сказать??
25 сентября Oralce официально выпустила Java 11, первую долгосрочную версию, поддерживаемую после Java 8.
Мы все знаем, что предыдущие версии не имели долгосрочной поддержки, однако имеет смысл выпустить эту последнюю версию с долгосрочной поддержкой сейчас.
В Java 11 также добавлено много новых функций, некоторые функции, конечно, удалены.
Вот дата выпуска java-версии:
java11 также обновляется из следующих мест (ниже скриншот официального сайта)
Поскольку 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 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/ только что…
Или посмотрите ссылку ниже
- [Flow API для реактивного программирования]:сообщество.Oracle.com/docs/doc-10…
- [Система модулей Java]:woohoo.Oracle.com/corporate/post…
- [Совместное использование данных класса приложения]:blog.code нашел C в .org/java/app…
- [Константы файла динамического класса]:openjdk.java.net/jeps/309
- [Java REPL (JShell)]:docs.Oracle.com/java-color/10/ просто…
- [Бортовой регистратор]:openjdk.java.net/jeps/328
- [Юникод 10]:openjdk.java.net/jeps/327
- [G1: Полностью параллельный сборщик мусора]:blog.i конечно Solutions.com/2018/04/ просто ав…
- [ZGC: масштабируемый сборщик мусора с малой задержкой]:openjdk.java.net/jeps/333
- [Эпсилон: сборщик мусора без операций]:openjdk.java.net/jeps/318
- [Устаревший движок Nashorn JavaScript]:openjdk.java.net/jeps/335
Использованная литература:
- docs.Oracle.com/en/java/ только что…
- откройте JDK.Java.net/projects/JD…
- зима be.com/posts/2018/…
- Woohoo. Сеть Oracle.com/tech…
Для получения дополнительной информации отсканируйте приведенный ниже QR-код, чтобы подписаться на нашу общедоступную учетную запись WeChat, и каждый день отправляйте свежую информацию и галантерею!
Обратите внимание на публичный аккаунт WeChat «Изучайте java хорошо», галантерея обновляется ежедневно!