1) Switch中使用String
package com.angelia;
public class JDK17SwitchString {
public static void main(String[] args) {
Week week = new Week();
System.out.println(week.getSpecificDay("Fri"));
}
}
class Week{
public String getSpecificDay(String abbrDay){
String specificDay;
switch (abbrDay) {
case "Mon":
specificDay = "Monday";
break;
case "Tue":
specificDay = "Tuesday";
break;
case "Wed":
specificDay = "Wednesday";
break;
case "Thu":
specificDay = "Thursday";
break;
case "Fri":
specificDay = "Friday";
break;
case "Sat":
specificDay = "Saturday";
break;
case "Sun":
specificDay = "Sunday";
break;
default:
throw new IllegalArgumentException("Invalid day of the week: " + abbrDay);
}
return "Today is " + specificDay;
}
}
2) 泛型实例创建过程中类型引用的简化
package com.angelia;
import java.util.ArrayList;
import java.util.List;
public class GenericsCollectionSimplify {
public static void main(String[] args) {
//Before 1.7
List<String> list1 = new ArrayList<String>();
//After 1.7
List<String> list2 = new ArrayList<>();
}
}
3) try-with-resources对资源的自动回收管理
try-with-resources语句确保在语句的最后每个资源都被关闭。实现了Java.lang.AutoCloseable和java.io.Closeable的对象都可以使用try-with-resource来实现异常处理和关闭资源。
package com.angelia;
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
public class ResourcesCollection {
public static void main(String[] args) {
//Before jdk1.7
BufferedReader br = null;
String str="";
try {
br = new BufferedReader(new FileReader("D:/test.txt"));
while ((str=br.readLine())!=null) {
System.out.println(str);
}
} catch (IOException e) {
System.out.println("Log....");
} finally {
if (br != null){
try {
br.close();
} catch (IOException e) {
System.out.println("Log....");
}
}
}
//After jdk1.7
try (BufferedReader br2 = new BufferedReader(new FileReader("D:/test.txt"))) {
while ((str=br2.readLine())!=null) {
System.out.println(str);
}
} catch (IOException e) {
System.out.println("Log....");
}
}
}
4)新的整数字面表达方式:数字字面量下划线”_”支持
int billion = 1_000_000_100;
5) 新的整数字面表达方式: 表示二进制字面值的前缀0b
byte b1 = 0b00100000; // New
byte b3 = 32; // Old
6) 在一个catch代码块中捕获多个异常
package com.angelia;
public class MoreThanOneException {
public static void main(String[] args) {
try {
Object str = Class.forName("java.lang.Exception").newInstance();
System.out.println(str);
} catch (ClassNotFoundException | InstantiationException | IllegalAccessException e) {
e.printStackTrace();
}
}
}
7)可变参数方法调用的简化
jdk1.7在变长参数和范型结合使用的时候,增加了一个注解@SafeVarargs。通过该注解来告诉编译器参数类型的安全性,以此来解决每次调用都出现编译警告的问题。
package com.angelia;
public class MoreThanOneException {
public static void main(String[] args) {
System.out.println(testVarargs(1, 2, 3));
}
/**
* 在jdk1.7之前,需要使用@SuppressWarnings("unchecked")注解来给每一个调用该方法的地方取消警告。
* 这是因为变长参数的实际值时通过数组来传递的,而数组中传递的时不可具化的范型对象,自身存在类型安全问题,所以编译器
* 会给出警告。这在调用java.utils.Arrays.asList方法和java.util.Collections.addAll方法中也会遇到。
* jdk1.7中提供了在该方法声明的地方加上@SafeVarargs注解。来表示该方法在与范型结合使用的时候不会出现类型安全问题。
* 此时再调用该方法,编译器不会给出警告信息。
* 不过需要注意的是,该方法必须声明为static或者final方法,否则会出现编译错误。
*/
@SafeVarargs
public static<T> T testVarargs(T... args) {
return args.length > 0 ? args[0] : null;
}
}