try的前面可以定义流对象,try后面的()中可以直接引用流对象的名称。在try代码执行完毕后,流对象也可以释放掉,也不用写finally了。增强了代码可读性
语法格式:
A a = new A();
B b = new B();
try(a;b){
可能产生的异常代码
}catch(异常类名 变量名){
异常处理的逻辑
}
举例:
@Test
public void test04() {
// 将流的声明,定义在try之前
InputStreamReader reader = new InputStreamReader(System.in);
OutputStreamWriter writer = new OutputStreamWriter(System.out);
// 在try()括号中,引入资源,即可自动关闭资源,不需要再手动关闭
try (reader; writer) {
// 前面创建的流,不可再被赋值重新,是finall的。只能使用,不能修改
// reader = null;
} catch (IOException e) {// 处理异常
e.printStackTrace();
}
}
局部变量的显示类型声明,常常被认为是不必须的,因而JDK10允许开发人员省略通常不必要的局部变量类型声明,以增强Java语言的体验性、可读性,使用对变量进行var
声明。
var使用示例:
//1.局部变量的实例化
var list = new ArrayList<String>();
var set = new LinkedHashSet<Integer>();
//2.增强for循环中的索引
for (var v : list) {
System.out.println(v);
}
//3.传统for循环中
for (var i = 0; i < 100; i++) {
System.out.println(i);
}
//4. 返回值类型含复杂泛型结构
var iterator = set.iterator();
//Iterator<Map.Entry<Integer, Student>> iterator = set.iterator();
不适用场景:
instanceof 模式匹配通过提供更为简便的语法,来提高生产力。有了该功能,可以减少Java程序中显式强制转换的数量,实现更精确、简洁的类型安全的代码。
JDK14之前的写法:
// 1。先判断
if(obj instanceof String){
// 2,强转
String str = (String)obj; //需要强转
// 3.使用
.. str.contains(..)..
}else{
...
}
JDK14新特性:
// 1.判断
if(obj instanceof String str){
//不再需要强转操作
// 2.如果类型匹配,直接使用
.. str.contains(..)..
}else{
// 如果类型不匹配,则不能使用
...
}
传统表达式缺点:
->
来代替以前的break;
,省去了因为少写break出现的错误。:
,但是,在同一个switch结构里不能混用->
和:
,否则会编译错误。举例:JDK12之前
public class SwitchTest {
public static void main(String[] args) {
int numberOfLetters;
Fruit fruit = Fruit.APPLE;
switch (fruit) {
case PEAR:
numberOfLetters = 4;
break;
case APPLE:
case GRAPE:
case MANGO:
numberOfLetters = 5;
break;
case ORANGE:
case PAPAYA:
numberOfLetters = 6;
break;
default:
throw new IllegalStateException("No Such Fruit:" + fruit);
}
System.out.println(numberOfLetters);
}
}
enum Fruit {
PEAR, APPLE, GRAPE, MANGO, ORANGE, PAPAYA;
}
JDK12新特性:
public class SwitchTest1 {
public static void main(String[] args) {
Fruit fruit = Fruit.GRAPE;
switch(fruit){
case PEAR -> System.out.println(4);//使用箭头操作符替换冒号,可以省略break关键字
case APPLE,MANGO,GRAPE -> System.out.println(5);//合并逻辑相同的case
case ORANGE,PAPAYA -> System.out.println(6);
default -> throw new IllegalStateException("No Such Fruit:" + fruit);
};
}
}
进一步优化:
public class SwitchTest2 {
public static void main(String[] args) {
Fruit fruit = Fruit.GRAPE;
int numberOfLetters = switch(fruit){//可以接收switch的返回值
case PEAR -> 4;
case APPLE,MANGO,GRAPE -> 5;
case ORANGE,PAPAYA -> 6;
default -> throw new IllegalStateException("No Such Fruit:" + fruit);
};
System.out.println(numberOfLetters);//操作switch的返回值
}
}
JDK13中引入了yield关键字,用于返回值并结束循环,而break只能结束switch循环,不能有返回值。
yield和return的区别在于:return会直接跳出当前循环或者方法,而yield只会跳出当前switch块。
以前的写法:
@Test
public void testSwitch1(){
String x = "3";
int i;
switch (x) {
case "1":
i=1;
break;
case "2":
i=2;
break;
default:
i = x.length();
break;
}
System.out.println(i);
}
JDK13中:
@Test
public void testSwitch3() {
String x = "3";
int i = switch (x) {
case "1":
yield 1;
case "2":
yield 2;
default:
yield 3;//结束闭关返回3
};
System.out.println(i);
}
static String formatter(Object o) {
String formatted = "unknown";
if (o instanceof Integer i) {//这里使用了 instanceof 的模式匹配
formatted = String.format("int %d", i);
} else if (o instanceof Long l) {
formatted = String.format("long %d", l);
} else if (o instanceof Double d) {
formatted = String.format("double %f", d);
} else if (o instanceof String s) {
formatted = String.format("String %s", s);
}
return formatted;
}
新特性:
static String formatterPatternSwitch(Object o) {
return switch (o) {
case Integer i -> String.format("int %d", i);// o为 Integer 类型才会执行
case Long l -> String.format("long %d", l);// o为 Long 类型才会执行
case Double d -> String.format("double %f", d);// o为 Double 类型才会执行
case String s -> String.format("String %s", s);// o为 String类型才会执行
default -> o.toString();
};
}
直接在 switch 上支持 Object 类型,这就等于同时支持多种类型,使用模式匹配得到具体类型,大大简化了语法量,这个功能很实用。
以前的文本块的写法,需要使用转义符和连接和来连接和控制文本格式,
String text1 = "The Sound of silence\n" +
"Hello darkness, my old friend\n" +
"I've come to talk with you again\n" +
"Because a vision softly creeping\n" +
"Left its seeds while I was sleeping\n" +
"And the vision that was planted in my brain\n" +
"Still remains\n" +
"Within the sound of silence";
System.out.println(text1);
新特性:使用""" """
来包裹文本,就不需要使用转义符来格式化文本格式,""" """
中包裹的文本时什么样格式,输出就是什么样格式。
同时也提供了转义符来控制文本输出格式:\
取消换行,\s
表示一个空格
String text2 = """
The Sound of silence
Hello darkness, my old friend
I've come to talk with you again
Because a vision softly creeping
Left its seeds while I was sleeping
And the vision that was planted in my brain
Still remains
Within the sound of silence
""";
System.out.println(text2);