JDK1.8,1.9新特性
java语言历史
版本号 | 年份 | 新特性 |
---|---|---|
1.0 | 1996 | |
1.1 | 1997 | JDBC |
1.2 | 1998,Playground | 集合,字符串池 |
1.3 | 2000,Kestrel | |
1.4 | 2004,Merlin | XML,正则,JDBC3.0,断言,NIO |
5.0 | 2004,Tiger | 泛型,注解,可变参数,枚举 |
6.0 | 2006,Mustang | 脚本,JDBC4.0 |
7.0 | 2011,Dolphin | NIO 2,try-with-resources |
8.0 | 2014.3 | 接口更新,Lambda表达式,方法引用,Stream API,函数式接口,Hashorn,JavaFx,DateTime |
9.0 | 2017.9 | Jigsaw模块化,Jshell,接口小更新 |
编程思想转换
- 二进制:101010
- 汇编语言
- 面向过程
- 面向对象
- 函数式编程思想
Lambda更优写法示例
-
面向对象写法
-
Runnable task = new Runnable() { @Override public void run() { System.out.printf("多线程任务执行啦!"); } }; new Thread(task).start();
-
-
函数式编程写法
-
new Thread(() -> System.out.printf("线程任务执行啦")).start();
-
Lambda表达式的标准格式
- 三要素
- 一些参数
- 一个箭头
- 一些代码
如果参数有多个,那么使用逗号分隔;如果参数没有,则留空
箭头是固定写法
大括号其实就相当于是方法体。
Lambda表达式的省略规则
- 参数的类型可以省略,但是只能同时省略所有的参数类型,或者干脆都不省略,不能只写个别参数的类型。
- 如果参数有且仅有一个,那么小括号可以省略
- 如果大括号之内的语句有且仅有一个,那么无论有没有返回值,return,大括号和分号,都可以省略。
Lambda表达式得有上下文推导
- 根据调用方法的参数推导得知Lambda对应的接口
- 根据局部变量的赋值来推导得知Lambda对应的接口
函数式接口
接口当中有且仅有一个抽象方法。
@FunctionalInterface注解:用来检测一个接口是不是函数式接口,(使用类似于@Override)
@FunctionalInterface是可选的,就算不写这个注解,只要保证接口满足函数式接口的定义,照样是函数式接口
- 如果是函数式接口,那么编译通过。
- 如果不是函数式接口,那么编译失败。
Lambda注意事项
- Lambda表达式并不是匿名内部类的语法糖
- 语法糖:代码的写法更加简便,但其实原理不变 eg:
- 方法中的可变参数,底层仍是一个数组
- 增强for循环用于Iterable实现类型,底层仍然是一个迭代器
- 自动装箱,自动拆箱
- 所需的类型不一样:
- 如果是匿名内部类,那么可以用接口,抽象类,普通类
- 如果是Lambda表达式,那么必须是接口
- 使用限制不一样
- 如果接口当中有且仅有一个抽象方法,那么使用Lambda表达式,也可以使用匿名内部类
- 如果接口当中抽象方法不唯一,那么是能使用匿名内部类,
- 语法糖:代码的写法更加简便,但其实原理不变 eg: