Jdk 新特性整理

前言

最普及的Jdk8升级Jdk13需要准备什么?多了哪些新特性?

最近我将我们的项目jdk进行升级了,升级意味着有新的特性、大家的环境也要随之升级、部署的镜像也要随之升级等等。

所以特开篇博客,持续记录一些比较有意思的新特性!

下次整理时间:Jdk17 LTS 大版本更新 (大约2021年 9月)

开发环境升级

  1. 官网安装jdk13.0.2或以上。

  2. 编辑器配置jdk。(IDEA需要升级2019.2以上的版本才能支持jdk13的新语法,破解或配置遇到问题可以找我,eclipse请自行百度~)

  3. 注意:jdk13的大部分功能基本上是预览功能,所以默认情况下是不能使用的,但是我已经在pom中将编译和容器中jvm参数都指定了–enable-preview参数,这样以下介绍的功能就全部可以使用了,选择jdk13就是为了这几个功能,必须安排!

  4. 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());
}

结果:

[first, second, third]

Java9新特性之接口Interface的升级

public interface FilterProcess<T> {

//java 7 及以前 特性 全局常量 和抽象方法
public static final String a ="22";
boolean process(T t);

//java 8 特性 静态方法和默认方法
default void love(){
System.out.println("java8 特性默认方法");
}
static void haha(){
System.out.println("java8 特性静态方法");
}

//java 8 特性 支持私有方法
private void java9(){}
}

Java9新特性之钻石操作符的升级

//java6及以前
Map<String,String> map7 = new HashMap<String,String>();
//java7和8 <>没有了数据类型
Map<String,String> map8 = new HashMap<>();
//java9 添加了匿名内部类的功能 后面添加了大括号{} 可以做一些细节的操作
Map<String,String> map9 = new HashMap<>(){};

Java9新特性之异常处理try升级

首先看下jdk6,7,8,9 的try catch的比较

Java6处理方式:

//java7及以前写法  每一个流打开的时候都要关闭
@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 共同的处理方式:

//java7和8及 每一个流打开的时候都要关闭,但是在try的括号中来进行关闭
@Test
public void test7(){
try(InputStreamReader reader =new InputStreamReader(System.in)){
reader.read();
}catch (IOException e){
e.printStackTrace();
}
}

java9的处理方式:

//java9及 每一个流打开的时候都要关闭,但是在try的括号中来进行关闭,在
//java8的基础上进一步升级 直接在try括号中直接写入 变量就好,如果有多个流,就用分号隔开
//try(reader;writer){}
@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,如图

img

而 dropWhile 则和takeWhile 相反

新特性深入了解

我只将咱们开发用的多或者特别有趣的新特性列在这里,其它新特性还有很多很多,有兴趣的小伙伴可以自己深入了解一下:

文章作者: 何同昊
文章链接: http://hetonghao.cn/2020/02/Jdk新特性整理/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 何同昊 Blog
支付宝超级火箭🚀
微信超级火箭🚀