Jdk1.7新特性

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

猜你喜欢

转载自blog.csdn.net/u014010512/article/details/78604724