java8
1.lambda和函数式接口
(a,b)-> a+b
2.方法引用
通过方法引用,可以使用方法的名字来指向一个方法。使用一对冒号来引 "::" 用方法。
3.接口默认方法和静态方法
通过default关键字表示,也可以提供静态默认方法
4.重复注解
@Author(name = "a")
@Author(name = "b")
// 解析注解
AnnotatedElement.getAnnotationsByType(Class<T>)
5.类型注解
private String author = (@Author(name="a")String) name;
6.更好的类型判断
// java7
List<String> stringList = new ArrayList<>();
stringList.add("A");
stringList.addAll(Arrays.<String>asList());
// java8
List<String> stringList = new ArrayList<>();
stringList.add("A");
stringList.addAll(Arrays.asList());
7.optional
Optional 是一个可以保存 null 的容器对象。通过 isPresent() 方法检测值是否存在,通过 get() 方法返回对象。
8.stream
将元素集合看做一种流,在管道中传输,经过一系列处理节点,最终输出结果。
9.日期和时间api
LocalDate,LocalTime,LocalDateTime,ZonedDateTime
10.base64支持
提供了对 Base 64 编码的支持
11.并行数组ParallelSort
Arrays.parallelSort(new int[] {1, 2, 3, 4, 5});
12.JVM 的新特性
JVM内存永久区已经被metaspace替换(JEP 122)。JVM参数 -XX:PermSize 和 –XX:MaxPermSize被XX:MetaSpaceSize 和 -XX:MaxMetaspaceSize代替。
java9
1.Jigsaw 模块系统
之前打包和依赖都基于jar包进行,jre包含了rt.jar,将近63m。
只运行一个简单的helloworld也需要依赖这么大的jar包。
java9提出的模块化系统,对这点进行了改善。
2. JShell REPL
有了 JShell 以后,Java 可以像 Python,Node.js 一样在 Shell 中运行一些代码并直接得出结果了。
3.私有接口方法,接口中使用私有方法
4. 集合不可变实例工厂方法
// java 8
Set<String> set = new HashSet<>();
set.add("A");
set.add("B");
set.add("C");
set = Collections.unmodifiableSet(set);
System.out.println(set);
// java 9
List<String> list = List.of("A", "B", "C");
Set<String> set = Set.of("A", "B", "C");
Map<String, String> map = Map.of("KA", "VA", "KB", "VB");
改进 try-with-resources
// java 8
InputStream inputStream = new StringBufferInputStream("a");
try (InputStream in = inputStream) {
in.read();
} catch (IOException e) {
e.printStackTrace();
}
// java 9
InputStream inputStream = new StringBufferInputStream("a");
try (inputStream) {
inputStream.read();
} catch (IOException e) {
e.printStackTrace();
}
java10
1.新增局部类型推断 var
var a = "aa";
System.out.println(a);
java11
1. Lambda 中使用 var
(var x, var y) -> x.process(y)
2. 字符串 API 增强
// 判断字符串是否为空白
" ".isBlank();
" Javastack ".stripTrailing(); // " Javastack"
" Javastack ".stripLeading(); // "Javastack "
3.java 直接编译并运行,省去先 javac 编译生成 class 再运行的步骤
java12
// Java 12 以后,switch 不仅可以作为语句,也可以作为表达式。
private String switchTest(int i) {
return switch (i) {
case 1 -> "1";
default -> "0";
};
}