Java 9 Flashcards
JShell
система для интерактивного программирования в консоли.
G:>jshell
| Welcome to JShell – Version 9-ea
| For an introduction type: /help intro
jshell> int a = 10
a ==> 10
jshell> System.out.println(“a value = “ + a)
a value = 10
immutableList
Неизменяемые объекты List, Set и Map «из коробки»
Oracle представила несколько удобных методов для создания неизменяемых List, Set, Map и Map.Entry объектов без использования дополнительных классов
List immutableList = List.of(); // пустой неизменяемый список
List immutableList = List.of(“one”,”two”,”three”); // неизменяемый список, содержащий информацию
Map имеет два набора методов: of() методы и ofEntries() методы для создания объектов Immutable Map и Map.Entry.
jshell> Map emptyImmutableMap = Map.of()
emptyImmutableMap ==> {} // пустое неизменяемое отображение
jshell> Map nonemptyImmutableMap = Map.of(1, “one”, 2, “two”, 3, “three”)
nonemptyImmutableMap ==> {2=two, 3=three, 1=one} // неизменяемое отображение
Private методы в интерфейсах
В Java 8 мы можем обеспечивать реализацию метода в интерфейсах, используя default и static методы. Однако мы не можем создавать private методы в интерфейсах.
Для избавления от нагромождения и переизбытка кода Oracle собирается добавить private методы в интерфейсы Java SE 9. Начиная с девятой версии, мы также сможем создавать private static методы в интерфейсах с помощью private.
Модульная система
Одним из самых значительных изменений является появление модульной системы. До Java 9 мы использовали JAR-файлы для разработки приложений, базирующихся на Java. Однако, эта архитектура имеет несколько ограничений и недостатков. Для их устранения и внедрили модульную систему. Это нововведение является частью проекта Jigsaw, который разрабатывается для того, чтобы программисты могли разбивать программы на независимые и межпрограммные модули.
Вот некоторые из функций этой системы:
модульная JDK; модульный исходный код Java; модульные run-time изображения; инкапсуляция внутренних API; система модульной платформы; JDK 9 поставляется с 92 модулями. Мы можем использовать их или создать свои, например:
try-with-resources
Как мы знаем, в Java SE 7 появилась новая конструкция обработки исключений Try-With-Resources для автоматического управления ресурсами. В Java SE 9 собираются внести несколько изменений в эту конструкцию, чтобы повысить читаемость.
Пример в Java SE 7:
void testARM_Before_Java9() throws IOException { BufferedReader reader1 = new BufferedReader(new FileReader("journaldev.txt")); try (BufferedReader reader2 = reader1) { System.out.println(reader2.readLine()); }
}
Пример в Java 9: void testARM_Java9() throws IOException { BufferedReader reader1 = new BufferedReader(new FileReader("journaldev.txt")); try (reader1) { System.out.println(reader1.readLine()); }} Можно заметить, что в новой версии, после try не обязательно объявлять новую переменную.
Реактивное программирование
В Java SE 9 появятся следующие API:
java. util.concurrent.Flow;
java. util.concurrent.Flow.Publisher;
java. util.concurrent.Flow.Subscriber;
java. util.concurrent.Flow.Processor.
public static void main(String[] args) {
PublishSubject subject = PublishSubject.create();
subject.onNext(1);
subject.subscribe(System.out::println);
subject.onNext(2);
subject.onNext(3);
subject.onNext(4);
Diamond оператор для анонимных классов
Вот как выглядит этот процесс в Java 8:
Box createBox(T content) { // Нужно поставить 'T' здесь 🙁 return new Box(content) { }; }
Вот как это выглядит в Java 9:
class inJava {
Box createBox(T content) { // Java 9 выводит ‘T’, потому что этот тип обозначаемый return new Box<>(content) { }; }
Box> createCrazyBox(Object content) { List > innerList = Arrays.asList(content); // А этот тип не выводится, так как не можем его обозначить: // return new Box<>(innerList) { }; // Вместо этого обозначаем тот тип, который нам нужен: return new Box>(innerList) { }; }
}
Проблема в не обозначаемых (англ. non-denotable) типах, которые распознаются компилятором, а JVM — нет. (Такой случай может быть обработан компилятором, но вопрос — как корректно передать его JVM.)
несколько полезных методов в java.util.Optional. в JAVA9
Stream emp = getEmployee(id);
Stream empStream = emp.flatMap(Optional::stream);
нововведения в java.util.Stream\
Наиболее важными являются dropWhile и takeWhile методы.
jshell> Stream.of(1,2,3,4,5,6,7,8,9,10).takeWhile(i -> i < 5 ).forEach(System.out::println);
Расширенные аннотации @Deprecated
До Java 9 @Deprecated — просто интерфейс-маркер. Многие разработчики предлагали Oracle улучшить информирование об устаревших возможностях API. Их услышали и добавили возможности работы с устаревшими API. Например, появились инструменты для их анализа — forRemoval и since.
HTTP/2 клиент
Oracle планирует выкатить новый HTTP-клиент для поддержки протоколов HTTP/2 и WebSocket. Они заменяют HttpURLConnection API на новый, более производительный.
Новый API будет представлен в пакете «java.net.http». Он поддерживает как синхронный, так и асинхронный режимы.