新特性会一起使用介绍 ,主要介绍主要特性及必须掌握次要功能。
使用openJDK :链接
jdk 路线图 :链接
jdk 发行说明:链接
非TLS版本(长期支持版本例如:jdk11)都是测试和新功能版本,每3年将发布一个TLS版本,意味着下一个TLS版本是jdk17
Lamdba 表达式
函数接口
- java.util.function 模块提供了常用函数接口,例如:消费者接口,生产者接口等,以消费者者接口为例
@FunctionalInterface
public interface Consumer<T> {
void accept(T t);
default Consumer<T> andThen(Consumer<? super T> after) {
Objects.requireNonNull(after);
return (T t) -> { accept(t); after.accept(t); };
}
}
- 自定义函数接口只能有一个方法,默认方法可以有多个,必须通过@FunctionalInterface注解声明
public class Test {
public static void main(String[] args) {
Consumer<String> consumer = new Consumer<String>() {
@Override
public void accept(String o) {
o += "test";
System.out.println(o);
}
};
consumer.accept("123");
}
}
- 转换成 Lamdba 表达式
public class Test {
public static void main(String[] args) {
Consumer<String> consumer = o -> {
o += "test";
System.out.println(o);
};
consumer.accept("123");
}
}
- 函数接口非常灵活可以应用任何地方,以上只是展示最简单的使用
DSL(Domain Specified Language)领域特定语言
由Lamdba 扩展了 DSL,spring security 大量使用DSL。
DSL 特性
- 提高开发效率,通过DSL来抽象构建模型,抽取公共的代码,减少重复的劳动;
- 和领域专家沟通,领域专家可以通过DSL来构建系统的功能;
- 执行环境的改变,可以弥补宿主语言的局限性。
Stream ( 管道流)
java.util.stream模块 将对象数组集合转成流进行任意操作
public class Test {
public static void main(String[] args) {
//去重遍历输出
Stream.of(1, 2, 1).distinct().forEach(new Consumer<Integer>() {
@Override
public void accept(Integer integer) {
System.out.println(integer);
}
});
}
}
public class Test {
public static void main(String[] args) {
//去重遍历输出,转成Lambda表达式
Stream.of(1, 2, 1).distinct().forEach(integer -> System.out.println(integer));
}
}
public class Test {
public static void main(String[] args) {
/*
* :: 方法引入语法 (双冒号语法)
* 去重遍历输出,转成方法引入语法(::调用的方法只有一个参数)
*/
Stream.of(1, 2, 1).distinct().forEach(System.out::println);
//Lambda写法将流转成数组
Integer[] arrays = Stream.of(1, 2, 1).distinct().toArray(value -> new Integer[value]);
//转换为方法引入语法 var jdk10 引入局部变量类型推断
var array = Stream.of(1, 2, 1).distinct().toArray(Integer[]::new);
}
}
jdk9 新增私有接口
public interface Test {
private void test() {
}
}
总结
JDK8 核心
- Lambda
- Stream
JDK8 其它必须掌握
- java.time 模块 例:LocalDate, LocalDateTime,Duration,TimeZone
- java.nio.file 模块 例:Files,Channels
JDK9 核心
- 接口私有方法
JDK9 其它必须掌握
- java.util模块 新增Optional 可以解决空指针烦恼
JDK10 核心
- 局部变量类型推断 var
JDK10 其它必须掌握
- 无
JDK11 核心
- 局部变量类型推断 var 在lambda中的使用
JDK11 删除Java EE和CORBA模块
注:部份主要功能未介绍,因为在后续jdk版本中移除。
下一个TLS版本jdk17预计2021年3月份发布, 将再次介绍 jdk12~17的 主要功能。
jdk12~17预览
- ZGC 垃圾回收器
- switch表达式
- 文本块
- instanceof的模式匹配
- sealed 关键字