前言 最普及的Jdk8升级Jdk13需要准备什么?多了哪些新特性?
最近我将我们的项目jdk进行升级了,升级意味着有新的特性、大家的环境也要随之升级、部署的镜像也要随之升级等等。
所以特开篇博客,持续记录一些比较有意思的新特性!
下次整理时间:Jdk17 LTS 大版本更新 (大约2021年 9月)
开发环境升级
官网安装jdk13.0.2或以上。
编辑器配置jdk。(IDEA需要升级2019.2以上的版本才能支持jdk13的新语法,破解或配置遇到问题可以找我,eclipse请自行百度~)
注意:jdk13的大部分功能基本上是预览功能,所以默认情况下是不能使用的,但是我已经在pom中将编译和容器中jvm参数都指定了–enable-preview 参数,这样以下介绍的功能就全部可以使用了,选择jdk13就是为了这几个功能,必须安排!
jdk所需的镜像环境已经构建好、并且容器运行测试通过,Dockerfile在spring-cloud-cabbage 项目的base-image 包下,感兴趣或者想加东西可以在这个文件夹一起维护。
新特性整理 switch优化更新 JDK11以及之前的版本 switch (day) { case MONDAY: case FRIDAY: case SUNDAY: System.out.println(6 ); break ; case TUESDAY: System.out.println(7 ); break ; case THURSDAY: case SATURDAY: System.out.println(8 ); break ; case WEDNESDAY: System.out.println(9 ); break ; }
JDK12版本 switch (day) { case MONDAY, FRIDAY, SUNDAY -> System.out.println(6 ); case TUESDAY -> System.out.println(7 ); case THURSDAY, SATURDAY -> System.out.println(8 ); case WEDNESDAY -> System.out.println(9 ); }
JDK13版本 static void howMany (int k) { System.out.println( switch (k) { case 1 -> "one" case 2 -> "two" default -> "many" } ); }
意味着现在我们可以抛弃掉以前的三元运算符,改用简化版的switch进行逻辑返回结果,比如:
System.out.println("最后的结果是:" + switch (2 ) { case 1 -> "1" ; default -> "2" ; });
文本块升级 html例子
JDK13之前 String html = "<html>\n" + " <body>\n" + " <p>Hello, world</p>\n" + " </body>\n" + "</html>\n" ;
JDK13 String html = "" " <html> <body> <p>Hello, world</p> </body> </html> " "" ;
这个写法在Python已经体验过了,早就厌倦了java的换行拼写了!
局部变量类型自动推断var var str = "666" ;System.out.println(str);
增加一些实用的API
JDK11又增加了许多字符串自带方法,如果以后用的舒服的话是否可以抛弃StringUtils?如下:
@Test public void contextLoads () { String str = "woshidage" ; boolean isblank = str.isBlank(); boolean isempty = str.isEmpty(); String result1 = str.strip(); String result2 = str.stripTrailing(); String result3 = str.stripLeading(); String copyStr = str.repeat(2 ); long lineCount = str.lines().count(); System.out.println(isblank); System.out.println(isempty); System.out.println(result1); System.out.println(result2); System.out.println(result3); System.out.println(copyStr); System.out.println(lineCount); }
完全支持Linux容器(包括Docker)
许多运行在Java虚拟机中的应用程序(包括Apache Spark和Kafka等数据服务以及传统的企业应用程序)都可以在Docker容器中运行。但是在Docker容器中运行Java应用程序一直存在一个问题,那就是在容器中运行JVM程序在设置内存大小和CPU使用率后,会导致应用程序的性能下降。这是因为Java应用程序没有意识到它正在容器中运行。随着Java 10的发布,这个问题总算得以解决,JVM现在可以识别由容器控制组(cgroups)设置的约束。可以在容器中使用内存和CPU约束来直接管理Java应用程序,其中包括:
遵守容器中设置的内存限制 在容器中设置可用的CPU 在容器中设置CPU约束 Java 10的这个改进在Docker for Mac、Docker for Windows以及Docker Enterprise Edition等环境均有效。 容器的内存限制 在Java 9之前,JVM无法识别容器使用标志设置的内存限制和CPU限制。而在Java 10中,内存限制会自动被识别并强制执行。Java将服务器类机定义为具有2个CPU和2GB内存,以及默认堆大小为物理内存的1/4。
copyOf方法
在java.util.List、java.util.Set、java.util.Map新增加了一个静态方法copyOf,这些方法按照其迭代顺序返回一个不可修改的列表、集合或映射包含了给定的元素的集合。但是如果将返回后的集合继续修改,那么报异常。
@Test public void test2 () { var list = new ArrayList<>(); list.add("first" ); list.add("second" ); list.add("third" ); var result = List.copyOf(list); System.out.println(result.toString()); }
结果:
Java9新特性之接口Interface的升级 public interface FilterProcess <T > { public static final String a ="22" ; boolean process (T t) ; default void love () { System.out.println("java8 特性默认方法" ); } static void haha () { System.out.println("java8 特性静态方法" ); } private void java9 () {} }
Java9新特性之钻石操作符的升级 Map<String,String> map7 = new HashMap<String,String>(); Map<String,String> map8 = new HashMap<>(); Map<String,String> map9 = new HashMap<>(){};
Java9新特性之异常处理try升级 首先看下jdk6,7,8,9 的try catch的比较
Java6处理方式: @Test public void test7 () { InputStreamReader reader = null ; try { reader = new InputStreamReader(System.in); reader.read(); }catch (IOException e){ e.printStackTrace(); }finally { if (reader != null ){ try { reader.close(); } catch (IOException e) { e.printStackTrace(); } } } }
JDK7,8 共同的处理方式: @Test public void test7 () { try (InputStreamReader reader =new InputStreamReader(System.in)){ reader.read(); }catch (IOException e){ e.printStackTrace(); } }
java9的处理方式: @Test public void test7 () { InputStreamReader reader =new InputStreamReader(System.in); try (reader){ reader.read(); }catch (IOException e){ e.printStackTrace(); } }
Java9新特性之Stream API 新方法的添加 在原有Stream API 新添加了4个方法,takeWhile dropWhile ofNullable iterate(新重载方法)
首先解释 takeWhile 当达到一定条件就结束:输出结果为45 43,如图
而 dropWhile 则和takeWhile 相反
新特性深入了解 我只将咱们开发用的多或者特别有趣的新特性列在这里,其它新特性还有很多很多,有兴趣的小伙伴可以自己深入了解一下: