Bootstrap

jdk7、jdk8、jdk21及其他版本新特性汇总

jdk下载链接
jdk是否收费

1.jdk7新特性

  1. 二进制字面量
    jdk7开始,可以用二进制字面量表示整数(byte、short、int、long)。使用二进制字面量可以让代码简介更易理解,使用时需要在二进制前加0b或者0B,示例如下:
int a = 0b110110
  1. 字面量支持下划线
    下划线不能出现在小数点旁、不能出现在数值开头和解围、不能出现在数值标示和进制之间,示例如下:
int a = 0b110_110
  1. swith语句支持字符串,示例如下:
switch(str)
case a:
     break;
case b:
     break;
  1. 泛型自动推断,示例如下:
List<String> list = new Arraylist<>();
  1. 异常多个catch合并,异常之间用|分割,示例如下:
try(){

} catch(IOExcepton | NullPointerException e) {

}

  1. try-with-resource语句支持
    之前使用流时需要在finally里手动关闭释放资源,现在只要接口实现java.lang.AutoCloseable,系统会自动关闭资源,示例如下:
private static void method() {
        FileReader fr = null;
        FileWriter fw = null;
		try {
			fr = new FileReader("a.txt");
			fw = new FileWriter("b.txt");
			int ch = 0;
			while ((ch = fr.read()) != -1) {
				fw.write(ch);
			}
		} catch (IOException e) {
			e.printStackTrace();
		} finally {
		   if (fw != null) {
		      fw.close();
		   }
		   if (fw != null) {
		      fr.close();
		   }
        }

		// 改进版的代码
		try (FileReader fr = new FileReader("a.txt");
				FileWriter fw = new FileWriter("b.txt");) {
			int ch = 0;
			while ((ch = fr.read()) != -1) {
				fw.write(ch);
			}
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

2.jdk8新特性

  1. lambada表达式
    lambada表达式也可成为闭包,允许将函数作为参数传递。lambada表达式组成:逗号分割的参数列表,-> ,函数体三部分表示,函数体比较复杂时可以将函数体放在{},示例如下:
new Thread( () -> System.out.println("In Java8, Lambda expression rocks !!") ).start();
  1. 日期API
    java.util.Date是非线程安全的,时区处理比较麻烦,jdk8在java.time包下提供了很多新的API,以下是两个重要的API:
    Local:简化了日期处理,没有时区问题
    Zoned:通过制定的时区处理日期时间
    示例如下:
LocalDate.now();  // 获取当前时间
ZonedDateTime.now(Clock.systemUTC()); // 获取UTC时区的时间
  1. 引入Optional,常用方法如下:
1Optional.of(T t): 创建一个Optional 实例
(2Optional.empty(): 创建一个空的Optional 实例
(3Optional.ofNullable(T t):若t不为null,创建 Optional 实例,否则创建空实例
(4isPresent():判断是否包含值 orElse(T t): 如果调用对象包含值,返回该值,否则返回t
(5orElseGet(Supplier s):如果调用对象包含值,返回该值,否则返回s获取的值
(6map(Function f):如果有值对其处理,并返回处理后的Optional,否则返回Optional.empty()7flatMap(Function mapper):与 map 类似,要求返回值必须是Optional
  1. Stream流,可对集合进行复杂的查找、过滤、去重、排序等,示例如下:
    Map<Integer, Integer> map = new HashMap<>();
	map.put(10, 10);
	map.put(31, 31);
	map.put(53, 53);
	map.put(86, 86);
	map.put(20, 20);
  	
  	// 转list
  	List<Integer> list = map.keySet().stream().collect(Collectors.toList());
  	
  	// 过滤获取偶数
  	list = list.stream().filter(item -> item % 2 == 0).collect(Collectors.toList());
  	
  	// 从大到小排序
  	list = list.stream().sorted((a, b) -> b - a).collect(Collectors.toList());
  	
  	list.stream().forEach(item -> {System.out.println(item);});
  1. 接口可以定义默认方法、静态方法
    默认方法:传统方式接口中定义的方法都是抽象方法,实现接口的类都需要实现抽象方法,接口中如果需要新增方法,所有类都要实现,不符合OCP原则。jdk8引入了默认方法,使用default关键字定义,可以有具体方法实现,实现类不必做修改。如果多个接口都有默认方法,可以用super指定默认方法,也可以自己实现覆盖。示例如下:
public interface Test{
   default void hello(){
      System.out.println("我是接口默认方法,哈哈!");
   }
}
  静态方法:接口中可以实现静态方法,示例如下:
public interface Test {
	public static void sysHello() {
		System.out.println("你好啊,我是接口静态方法!");
	}
}
  1. 函数式接口
    如果一个接口只有一个抽象方法,该接口可以称之为函数式接口,函数式接口可以使用lambada表达式,lambada会被匹配到这个抽象方法上,@FunctionalInterface注解检测接口是否符合函数式接口,常见的函数式接口Predicate,Function<T,R>,示例如下:
public class Test03 {
 
    public static void main(String[] args) {
        Operater o=arr -> {
             int sum=0;
             for(int n:arr){
                 sum+=n;
             }
            System.out.println("数组的和为:"+sum);
        };
 
        fun(o);
    }
 
    public static void fun(Operater operater){
         int[] arr={2,3,4,5,6,7,11};
         operater.getSum(arr);
    }
 
}

@FunctionalInterface
interface Operater{
    //求数组的和
    public abstract void getSum(int[] arr);
}
  1. 方法引用
    方法引用是lambada的一种简写形式。如果lambada表达式方法体中只是调用一个特定的已存在的方法,则可以使用方法引用。常见形式:
对象::实例方法
类::静态方法
类::实例方法
类::new
;