JDK7/8的新特性

JDK7的新特性

数值表示

JDK7之中,byte 类型的变量可以直接赋值二进制,如:

1
byte var = 0B00000101

数字之间可以加上下划线,以便更好地阅读,如:

1
int var = 4_000_000;

switch 语句接受 String

在 JDK7之前的 switch语句中,case 无法判断目标值是哪个字符串,而从 JDK7开始,你可以毫不犹豫地这么干:

1
2
3
4
5
6
7
8
9
10
String str = "hello";
switch (str) {
case "hi" :
// doSomething();
break;
case "hello":
break;
default:
break;
}

泛型对象

实例化一个泛型对象时,不必再在菱形中具体指出是类型:

1
List<String> list = new ArrayList<>();

Try with resource

以前,在 try 语句之中我们一般会打开 IO 资源进行操作,如果有异常便抛出异常进行处理,一般try 语句也会附带一个关闭语句。
如果只是在打开资源时出现异常就很好办,直接在 catch 语句中捕捉异常即可,但是如果在关闭资源时又出现异常怎么办?
答:之前的异常被抛弃,只抛出关闭异常。
这个问题的场景就引出了 try with resource,不仅自动处理资源的关闭,而且在出现 close 异常时,既抛出之前的异常,也抛出 close 异常:

1
2
3
4
5
6
// 括号中的资源会被自动关闭
try (BufferedReader bufferedReader = new BufferedReader(new FileReader(str))) {
// doSomething()
} catch (IOException e) {
e.printStackTrace();
}

Multi catch

往后,在一个 catch 语句当中,可以捕获多个异常,如:

1
2
3
4
5
6
try (xxxx)) {
// doSomething()
// 捕捉多个异常
} catch (IOException | AcceptPendingException e ) {
e.printStackTrace();
}

异常重抛

以往,我们在 try 之中抛出子异常,而在 catch 中检测到的是父异常,如果在 catch 中又将异常抛出,那么外部就只能捕获到父异常,而无法知晓具体的子异常是什么,在JDK7里可以手动地限制整个类抛出的子类(哪怕 catch 中捕获到的是父类)

JDK8 的新特性

Lambda 表达式

将函数作为另一个函数的参数

重复注解

同一个注解可以在同一个地方出现多次

接口的默认方法和静态方法

静态方法类似于单例模式,默认方法不像抽象方法那样必须被实现(加上一个default 关键字),实现类既可以实现该方法,也可以不实现该方法。