前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【JDK 17 新特性】jdk8~jdk17新特性

【JDK 17 新特性】jdk8~jdk17新特性

作者头像
CODER-V
发布2023-03-09 09:09:36
1.3K0
发布2023-03-09 09:09:36
举报
文章被收录于专栏:藏经阁

1. try-catch-finally 资源自动关闭—JDK9

try的前面可以定义流对象,try后面的()中可以直接引用流对象的名称。在try代码执行完毕后,流对象也可以释放掉,也不用写finally了。增强了代码可读性

语法格式:

代码语言:javascript
复制
A a = new A();
B b = new B();

try(a;b){
    可能产生的异常代码
}catch(异常类名 变量名){
    异常处理的逻辑
}

举例:

代码语言:javascript
复制
@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();
    }
}

2. 局部变量类型推断—JDK10

局部变量的显示类型声明,常常被认为是不必须的,因而JDK10允许开发人员省略通常不必要的局部变量类型声明,以增强Java语言的体验性、可读性,使用对变量进行var声明。

var使用示例:

代码语言:javascript
复制
//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();

不适用场景:

  • 声明一个成员变量:var i; var i =0;
  • 声明一个数组变量,并为数组静态初始化(省略new的情况下):var arr = {1,2,3};
  • 方法的返回值类型:public var method(var m){}
  • 方法的参数类型:public var method(var m){}
  • 没有初始化的方法内的局部变量声明:public void method(){ var i; var j = 0; }
  • 作为catch块中异常类型:try{…}catch(var e){…}
  • Lambda表达式中函数式接口的类型:var lambda = ()->{}
  • 方法引用中函数式接口的类型:var method = String :: equals

3. intanceof模式匹配—JDK14

instanceof 模式匹配通过提供更为简便的语法,来提高生产力。有了该功能,可以减少Java程序中显式强制转换的数量,实现更精确、简洁的类型安全的代码。

JDK14之前的写法:

代码语言:javascript
复制
// 1。先判断
if(obj instanceof String){
	// 2,强转
    String str = (String)obj; //需要强转
    // 3.使用
    .. str.contains(..)..
}else{
    ...
}

JDK14新特性:

代码语言:javascript
复制
// 1.判断
if(obj instanceof String str){
	//不再需要强转操作
	// 2.如果类型匹配,直接使用
    .. str.contains(..)..
}else{
	// 如果类型不匹配,则不能使用
    ...
}

4. switch表达式

传统表达式缺点:

  1. 语句的执行是从上往下的,如果忘记了写break,后面的case语句无论匹配与否都会被执行——>case穿透。
  2. 所有case语句共用一个快范围(作用域),在不同的case语句中不能定义同名的变量。
  3. 不能在一个case语句里写多个执行结构一致的条件。
  4. 整个switch不能作为表达式的返回值。

4.1 break可省、case可合并、switch返回值可接收—JDK12

  • 使用->来代替以前的break;,省去了因为少写break出现的错误。
  • 同时可以将多个case合并到一行,显得简洁、清晰。
  • 注意:为了保证兼容性,case田间语句中依然可以使用:,但是,在同一个switch结构里不能混用->:,否则会编译错误。

举例:JDK12之前

代码语言:javascript
复制
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新特性:

代码语言:javascript
复制
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);
        };
    }
}

进一步优化:

代码语言:javascript
复制
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的返回值
    }
}

4.2 yield关键字—JDK13

JDK13中引入了yield关键字,用于返回值并结束循环,而break只能结束switch循环,不能有返回值。

yield和return的区别在于:return会直接跳出当前循环或者方法,而yield只会跳出当前switch块。

以前的写法:

代码语言:javascript
复制
@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中:

代码语言:javascript
复制
@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);
}

4.3 switch模式匹配

代码语言:javascript
复制
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;
}

新特性:

代码语言:javascript
复制
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 类型,这就等于同时支持多种类型,使用模式匹配得到具体类型,大大简化了语法量,这个功能很实用。

5. 文本块

以前的文本块的写法,需要使用转义符和连接和来连接和控制文本格式,

代码语言:javascript
复制
 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表示一个空格

代码语言:javascript
复制
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);
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2023-03-08,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1. try-catch-finally 资源自动关闭—JDK9
  • 2. 局部变量类型推断—JDK10
  • 3. intanceof模式匹配—JDK14
  • 4. switch表达式
    • 4.1 break可省、case可合并、switch返回值可接收—JDK12
      • 4.2 yield关键字—JDK13
        • 4.3 switch模式匹配
        • 5. 文本块
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档