Ставьте лайк и смотрите снова, вырабатывайте хорошую привычку
Обновление JAVA в последние годы действительно слишком... быстрое, JAVA 8 давно не используется, а 16 выпущена. С момента выхода Lambda и Stream в JAVA 8, JAVA как куриная кровь.Каждые пол года выходит версия, а ослики производственной команды не такие усердные.
Приведите нас, чтобы не отставать от ритма JAVA теперь полностью выпущена, Отдел I в настоящее время все еще в JAVA 8, и даже некоторые из старых систем все еще используют JAVA 7, не могут легко обновиться.
不过虽然暂时用不上最新版本的 JAVA,但了解每个新版本的主要特性还是很重要的,不然哪天真跟着升级了,那还不得一脸懵逼。
Эта статья поможет вам быстро понять основные новые функции JAVA 9–16 и пораньше уйти с работы после школы!
Java 9 (сентябрь 2017 г.)
Частные интерфейсы могут быть добавлены к интерфейсу
В JAVA 8 добавлена поддержка методов по умолчанию для интерфейсов.В JAVA 9 эта функция была снова обновлена.Теперь вы можете определять приватные методы в интерфейсах, а затем вызывать приватные методы интерфейсов в методах по умолчанию.
Это позволяет повторно использовать код в закрытых методах, не раскрывая код.
public interface TestInterface {
default void wrapMethod(){
innerMethod();
}
private void innerMethod(){
System.out.println("");
}
}
Анонимные внутренние классы также поддерживают оператор алмаза.
В Java 5 представлен дженерик, а оператор Diamond запускается в Java 7:<>
, тип обобщения может быть определен автоматически:
List<Integer> numbers = new ArrayList<>();
Однако оператор алмаза, который автоматически выводит тип, не поддерживает анонимные внутренние классы.В JAVA 9 также поддерживаются анонимные внутренние классы:
List<Integer> numbers = new ArrayList<>() {
...
}
повышеннаяtry-with-resources
Добавлено в ЯВА 7try-with-resources
Поддержка автоматического закрытия ресурсов:
try (BufferedReader bufferReader = new BufferedReader(...)) {
return bufferReader.readLine();
}
Но когда нужно объявить несколько переменных ресурсов, код выглядит немного отвратительно, нужно прописать процесс создания нескольких переменных в try:
try (BufferedReader bufferReader0 = new BufferedReader(...);
BufferedReader bufferReader1 = new BufferedReader(...)) {
return bufferReader0.readLine();
}
Эта функция была улучшена в JAVA 9, чтобы автоматически закрыться, ссылаясь на переменную вне блока try:
BufferedReader bufferReader0 = new BufferedReader(...);
BufferedReader bufferReader1 = new BufferedReader(...);
try (bufferReader0; bufferReader1) {
System.out.println(br1.readLine() + br2.readLine());
}
ЯВА 10 (март 2018 г.)
Автоматический вывод типа для локальных переменных (var)
JAVA 10 предлагает интересный синтаксис:var
, он может автоматически определять тип локальных переменных, не нужно записывать тип в будущем и не нужно полагаться на ломбокские переменные.var
Улучшенная аннотация
var message = "Hello, Java 10";
Однако это всего лишь синтаксис, скомпилированные переменные или имеют тип, или рассмотрение проблемы ремонтопригодности, иначе это может быть стиль JavaScript.
ЯВА 11 (сентябрь 2018 г.)
Автоматический вывод типа (var) в Lambda
Синтаксис Lambda также поддерживается в JAVA 11.var
Эта переменная автоматического вывода типа также может добавлять дополнительные аннотации через переменную var:
List<String> languages = Arrays.asList("Java", "Groovy");
String language = sampleList.stream()
.map((@Nonnull var x) -> x.toUpperCase())
.collect(Collectors.joining(", "));
assertThat(language).isEqualTo("Java, Groovy");
javac + java команда шаттла
Раньше при компиляции java-файла вам нужно было сначала скомпилировать javac в класс, а затем выполнить его с помощью java, теперь вы можете это сделать:
$ java HelloWorld.java
Hello Java 11!
Java Flight Recorder выходит на OpenJDK
Java Flight RecorderЭто инструмент диагностики отладки для серого, но он есть в Oracle JDK, он также открыт для JDK 11. Openjdk также может использовать эту функцию, настоящий аромат!
ЯВА 12 (март 2019 г.)
Более лаконичный синтаксис переключателя
В предыдущих версиях JAVAswitch
Синтаксис по-прежнему довольно многословен, если несколько значений следуют одной логике, вам нужно написать несколькоcase
:
DayOfWeek dayOfWeek = LocalDate.now().getDayOfWeek();
String typeOfDay = "";
switch (dayOfWeek) {
case MONDAY:
case TUESDAY:
case WEDNESDAY:
case THURSDAY:
case FRIDAY:
typeOfDay = "Working Day";
break;
case SATURDAY:
case SUNDAY:
typeOfDay = "Day Off";
}
В JAVA 12 эта штука стала очень простой, всего несколько строчек, и! Также поддерживаются возвращаемые значения:
typeOfDay = switch (dayOfWeek) {
case MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY -> "Working Day";
case SATURDAY, SUNDAY -> "Day Off";
};
instanceof + приведение типа за один шаг
При работе с динамическими типами раньше, когда вам нужно принудительно преобразовать, вам нужно сначалаinstanceof
Оцените это, а затем приведите к такому типу для обработки:
Object obj = "Hello Java 12!";
if (obj instanceof String) {
String s = (String) obj;
int length = s.length();
}
в настоящее времяinstanceof
Поддерживается прямое преобразование типов, дополнительное приведение не требуется:
Object obj = "Hello Java 12!";
if (obj instanceof String str) {
int length = str.length();
}
ЯВА 13 (сентябрь 2019 г.)
Синтаксис переключателя был улучшен.
Хотя в Java 12swtich
синтаксис, но не в->
После написания сложной логики JAVA 12 приноситswtich
Более совершенный опыт, напримерlambda
Точно так же вы можете написать логику, а затем вернуть:
typeOfDay = switch (dayOfWeek) {
case MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY -> {
// do sth...
yield "Working Day";
}
case SATURDAY, SUNDAY -> "Day Off";
};
Поддержка текстового блока
Вас по-прежнему смущает большой сегмент строковых сообщений с переводами строк, обтекание кучей переводов строк, а без перевода строки смотреть неудобно:
String json = "{\"id\":\"1697301681936888\",\"nickname\":\"空无\",\"homepage\":\"https://juejin.cn/user/1697301681936888\"}";
JAVA 13 решает эту отвратительную проблему за вас, добавляет поддержку текстовых блоков, и теперь вы можете с удовольствием оборачивать строки, как с помощью шаблонов:
String json = """
{
"id":"1697301681936888",
"nickname":"空无",
"homepage":"https://juejin.cn/user/1697301681936888"
}
""";
ЯВА 14 (март 2020 г.)
Новый тип записи, чтобы избавиться от сложных классов POJO
Как правило, когда мы создаем класс POJO, нам нужно определить список свойств, конструктор, геттер/сеттер, что более проблематично. JAVA 14 предоставляет нам удобный способ создания классов —record
public record UserDTO(String id,String nickname,String homepage) { };
public static void main( String[] args ){
UserDTO user = new UserDTO("1697301681936888","空无","https://juejin.cn/user/1697301681936888");
System.out.println(user.id);
System.out.println(user.nickname);
System.out.println(user.id);
}
IDEA уже поддерживает эту функцию, и вы можете выбрать ее прямо при создании класса: Но это просто синтаксический сахар. После компиляции это все еще класс, который не сильно отличается от обычного класса.
Более интуитивно понятные советы NULLPOINTEREXCEPTION
NullPointerExceptionЭто одно из наиболее распространенных исключений в JAVA, но подсказка этой вещи действительно недружественна.При встрече с более длинными цепочками выражений невозможно определить, какой объект пуст.
Например, в следующем примере, что такоеinnerMap
пустой илиeffected
А пусто?
Map<String,Map<String,Boolean>> wrapMap = new HashMap<>();
wrapMap.put("innerMap",new HashMap<>());
boolean effected = wrapMap.get("innerMap").get("effected");
// StackTrace:
Exception in thread "main" java.lang.NullPointerException
at org.example.App.main(App.java:50)
JAVA 14 также добрался до болевых точек JAVAER и оптимизировал подсказку NullPointerException, чтобы вы не запутались и могли с первого взгляда найти «пустое»!
Exception in thread "main" java.lang.NullPointerException: Cannot invoke "java.lang.Boolean.booleanValue()" because the return value of "java.util.Map.get(Object)" is null
at org.example.App.main(App.java:50)
Теперь StackTrace очень интуитивно понятен и прямо говорит вамeffected
Переменная пуста, больше никакой путаницы!
Безопасный интерфейс чтения и записи памяти вне кучи, больше не играйте в трюки Unsafe
В предыдущих версиях, если JAVA хотела работать с памятью вне кучи (DirectBuffer), ей приходилось отключать различные операции копирования/получения/смещения. Теперь был добавлен набор безопасных интерфейсов доступа к памяти вне кучи, которые могут легко получить доступ к памяти вне кучи и больше не должны выполнять небезопасные операции.
// 分配 200B 堆外内存
MemorySegment memorySegment = MemorySegment.allocateNative(200);
// 用 ByteBuffer 分配,然后包装为 MemorySegment
MemorySegment memorySegment = MemorySegment.ofByteBuffer(ByteBuffer.allocateDirect(200));
// MMAP 当然也可以
MemorySegment memorySegment = MemorySegment.mapFromPath(
Path.of("/tmp/memory.txt"), 200, FileChannel.MapMode.READ_WRITE);
// 获取堆外内存地址
MemoryAddress address = MemorySegment.allocateNative(100).baseAddress();
// 组合拳,堆外分配,堆外赋值
long value = 10;
MemoryAddress memoryAddress = MemorySegment.allocateNative(8).baseAddress();
// 获取句柄
VarHandle varHandle = MemoryHandles.varHandle(long.class, ByteOrder.nativeOrder());
varHandle.set(memoryAddress, value);
// 释放就这么简单,想想 DirectByteBuffer 的释放……多奇怪
memorySegment.close();
Для студентов, которые не понимают, как Unsafe работает с памятью вне кучи, вы можете обратиться к другой моей статье "Будете ли вы использовать класс Unsafe, который часто используется в JDK для повышения производительности?》
Новый инструмент упаковки jpackage может напрямую упаковывать двоичные программы, больше не нужно устанавливать JRE.
Раньше, если мы хотели создать исполняемую программу, нам нужно было использовать сторонние инструменты для упаковки JRE или установить JRE на клиентский компьютер, прежде чем мы могли запустить нашу программу JAVA.
Теперь JAVA напрямую встроенаjpackage
Инструмент упаковки, который поможет вам упаковать двоичные пакеты одним щелчком мыши, и, наконец, вам не придется возиться
ЯВА 15 (сентябрь 2020 г.)
ZGC и Shenandoah два сборщика мусора официально приземлились
В JAVA 15 ZGC и Shenandoah больше не являются экспериментальными функциями и официально добавлены (хотя G1 по-прежнему используется по умолчанию). Если вы обновитесь до версии после JAVA 15, попробуйте сейчас, производительность выше, а задержка ниже.
Закрытый (запечатанный) класс
Наследование Java можно выбрать только для наследования или не наследовать (окончательную модификацию), и теперь была добавлена новая особенность герметичного (герметичного) класса, и некоторые классы могут быть указаны до того, как они могут быть унаследованы:
public sealed interface Service permits Car, Truck {
int getMaxServiceIntervalInMonths();
default int getMaxDistanceBetweenServicesInKilometers() {
return 100000;
}
}
ЯВА 16 (март 2021 г.)
ЯВА 16 дюймоввиден пользователюИзменений не много, в основном экспериментальный контент 14/15, а официальный релиз 16, поэтому повторять вступление здесь не буду.
Суммировать
Различные новые функции, представленные выше, некоторые из которых все еще являются экспериментальными в исторической версии, но в соответствии с текущей частотой обновлений JAVA вполне вероятно, что следующая версия будет стабильной.Раннее обучение и раннее удовольствие, позднее обучение сметается...
Посмотрите на время, 300 секунд истекли?
Нелегко быть оригинальным, и несанкционированная перепечатка запрещена. Если моя статья полезна для вас, пожалуйста, поставьте лайк/добавьте в избранное/подпишитесь, чтобы поддержать и поддержать ее ❤❤❤❤❤❤