欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Jdk1.7新特性

程序员文章站 2022-07-14 13:42:40
...

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;
    }
}