JDK8-17新特性-JDK8之后的语法新特性汇总上

新语法结构

1.JAVA的REPL工具:jShell命令

  • JDK9的新特性

java拥有了像python和scala之类的语言的REPL工具(交互式编程环境,read - evaluate - print - loop) :
jShell。以交互式的方式对语句和表达式进行求值。(即写即得、快速运行)。
注意:利用jShell在没有创建类的情况下,在命令行里直接声明变量,计算表达式,执行语句。无需解释"public static void main(String[] args)"

2.使用举例:

  • 调出jShell

  • 获取帮助

  • 基本使用

3.常用的jShell命令

  • 命令行中通过指令jShell,调取jShell工具

  • 常用指令:

    • /help:获取有关使用 jShell 工具的信息
    • /help intro:jShell 工具的简介
    • /list:列出当前 session里所有有效的代码片段
    • /vars:查看当前session下所有创建过的变量
    • /methods:查看当前 session 下所有创建过的方法
    • /imports:列出导入的包
    • /history:键入的内容的历史记录
    • /edit:使用外部代码编译器来编写 Java 代码
    • /exit:退出 jShell 工具

4.异常处理 - try-catch资源关闭

  • JDK7之前,我们处理资源的关闭的写法:

/**
 * JDK7之前
 */
@Test
void test01() {
    FileWriter fw = null;
    BufferedWriter bw = null;
    try {
        fw = new FileWriter("test.txt");
        bw = new BufferedWriter(fw);
​
        bw.write("我是你爸爸");
    } catch (IOException e){
        e.printStackTrace();
    } finally {
        try {
            if (bw != null){
                bw.close();
            }
        } catch (IOException e){
            e.printStackTrace();
        }
    }
}
  • JDK7的新特性

在try的后面可以增加一个(),在括号中可以说明流对象并初始化。try中的代码执行完毕,会自动把流对象释放。就不用写finally了。
  • 格式

try(资源对象的声明和初始化){
    业务逻辑代码,可能会产生异常
} catch(异常类型1 e){
    处理异常代码
} catch(异常类型2 e){
    处理异常代码
}
  • 注意:

    • 1.在try()中说明的资源,无论是否发生异常,无论是否处理异常,都会自动关闭资源对象,不用手动关闭了。
    • 2.这些资源实现类必须实现AutoCloseable或Closeable接口,实现其中的close方法。Closeable是AutoCloseable的子接口。Java几乎把所有的"资源类"(包括文件IO的各种类、JDBC编程的Connection、Statement等接口...)都进行了改写,改写后资源类都实现了AutoCloseable或Closeable接口,并实现了close()方法。
    • 3.写到try()中的资源类的变量默认是final声明的,不能修改。
    • 4.类图如下:

  • 例如:

    • 例一
/**
 * JDK7中
 */
@Test
void test02() {
    try (FileWriter fw = new FileWriter("test.txt");
         BufferedWriter bw = new BufferedWriter(fw);
    ) {
        bw.write("我是你爷爷");
    } catch (IOException e) {
        e.printStackTrace();
    }
}

  • 例二:

    • JDK7之前
/**
 * 举例2:从test.txt(utf-8)文件中,读取内容,写出到abc.txt(gbk)文件中
 * JDK7之前
 */
@Test
void test03() {
    BufferedReader br = null;
    BufferedWriter bw = null;
    try {
​
        FileInputStream fis = new FileInputStream("test.txt");
        InputStreamReader isr = new InputStreamReader(fis, "utf-8");
        br = new BufferedReader(isr);
​
        FileOutputStream fos = new FileOutputStream("abc.txt");
        OutputStreamWriter osw = new OutputStreamWriter(fos,"gbk");
        bw = new BufferedWriter(osw);
​
        String str;
        while ((str = br.readLine()) != null) {
            bw.write(str);
            bw.newLine();
            bw.flush();
        }
    } catch (IOException e) {
        e.printStackTrace();
    } finally {
        try {
            if (bw != null) {
                bw.close();
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
        try {
            if (br != null){
                br.close();
            }
        } catch (IOException e){
            e.printStackTrace();
        }
    }
}
  • JDK7中

/**
 * 举例2:从test.txt(utf-8)文件中,读取内容,写出到abc.txt(gbk)文件中
 * JDK7及JDK7之后中
 */
@Test
void test04() {
    try (
            FileInputStream fis = new FileInputStream("test.txt");
            InputStreamReader isr = new InputStreamReader(fis, "utf-8");
            BufferedReader br = new BufferedReader(isr);
            FileOutputStream fos = new FileOutputStream("abc.txt");
            OutputStreamWriter osw = new OutputStreamWriter(fos, "gbk");
            BufferedWriter bw = new BufferedWriter(osw);
    ) {
        String str;
        while ((str = br.readLine()) != null) {
            bw.write(str);
            bw.newLine();
            bw.flush();
        }
    } catch (IOException e) {
        e.printStackTrace();
    }
}

注:很大程度上减少了代码的使用量

5.JDK9的新特性

try的前面可以定义流对象,try后面的()中可以直接引用流对象的名称。try代码执行完毕后,流对象也可以释放掉,也不用写finally了。
  • 格式:
A a = new A();
B b = new B();
try(a;b){
    可能出现的异常代码
} catch(异常类名 变量名){
    异常处理的逻辑
}
  • 示例:
    @Test
    void test5() {
​
        InputStreamReader reader = new InputStreamReader(System.in);
        OutputStreamWriter writer = new OutputStreamWriter(System.out);
​
        try (reader;writer) {
//            String str;
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

6.JDK10的新特性

局部变量的显示类型声明,常常被认为是不必须的,给一个好听的名字反而可以很清楚的表达出下面应该怎么继续。本新特性允许开发人员省略通常不必要的局部变量类型声明,以增加java语言的体验性、可读性。
  • 使用举例

//可以使用的场景
@Test
void test6() {
    //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();
​
    HashMap<String, Integer> map = new HashMap<>();
    var entrySet =map.entrySet();
}
  • 不适合的场景

    • 声明一个成员变量
    • 声明一个数组变量,并为数组静态初始化(省略new 的情况下)
    • 方法的返回值类型
    • 方法的参数类型
    • 没有初始化的方法内的局部变量声明
    • 作为catch块中异常类型
    • Lambda表达式中函数式接口的类型
    • 方法引用中函数式接口的类型

7.instanceof模式匹配

JDK14预览
JDK15二次预览
JDK16转正特性
  • JDK14之前:

//先判断类型
if (obj instanceof String) {
    //然后转换
    String s = (String) obj;
    //然后才能使用
}
  • JDK14:(自动匹配模式)

if (obj instanceof String s) {
    //如果类型匹配 直接使用
} else {
    //如果类型不匹配则不能直接使用
}

  • 代码示例

    • JDK14之前
@Test
void test7() {
    Object obj = new String("hello,java14");
​
    if (obj instanceof String) {
        String str = (String) obj;
        System.out.println(str.contains("java"));
    } else {
        System.out.println("jsjjdsjsd");
    }
}
  • JDK14中

@Test
void test8() {
    Object obj = new String("hello,java14");
​
    if (obj instanceof String str) {
        System.out.println(str.contains("java"));
    } else {
        System.out.println("jsjjdsjsd");
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值