文档地址:
http://docs.Oracle.com/javase/8/docs/
Oracle有两个实现了Java平台标准版本(Java SE)8,即Java标准开发工具(JDK)8和Java标准运行时环境(JRE)8.
JDK8是JRE8的超集,包含了JRE8的所有内容,还包括诸如编译器和调试器等在开发applet和application时必要的开发环境。JRE8提供函数库,java虚拟机(JVM)以及其他用于运行用Java编程语言编写的applets和applications。注意,JRE包含了在Java SE规范中并不作要求的组件,包括标准和非标准Java组件。
图1. Java概念图
Java8中的增强功能
http://docs.oracle.com/javase/8/docs/technotes/guides/language/enhancements.html#javase8
1. lambda表达式(Lambda ExPRessions):让你能够将一个动作单元进行压缩,并将其传递给其他代码。如果你希望当某个过程结束后,或当某个过程发生异常后,在collection内的每个元素上执行一个特定动作,你可以用lambda表达式来达到目的。lambda表达式由以下特点所支持:
(1)方法引用(Method References):对于已命名的方法,方法引用是紧凑且易读的lambda表达式;
(2)默认方法(Default Methods):让你能够将新功能添加到函数库的接口,并且确保于旧版本接口的二进制兼容性(binary compatibility)。他们是被实现了的接口方法,并且是方法签名起始处的默认关键词。此外,你可以在接口中定义静态方法。
(3)基于Java8中lambda表达式和Streams的新的增强版API(New and Enhanced APIs That Take Advantage of Lambda Expressions and Streams in Java SE 8);
2. 类型推断个改进:Java编译器利用目标类型来判断通用方法调用(generic method invocation)中的参数类型。一个表达式的目标类型,是java编译器依据该表达式出现位置所期望的数据类型。例如,你可以在Java SE7中将赋值语句的目标类型用于类型推断。然而,在Java SE 8汇总,你可以在更多场景中将目标类型用于类型推断。最突出的例子是使用方法调用的目标类型来判断其参数的数据类型。
考虑如下例子:
List<String> stringList = new ArrayList<>();stringList.add("A");stringList.addAll(Arrays.asList());先暂且忽略泛型(generics),addAll方法期望一个Collection实例作为参数,并且Arrays.asList方法返回了List实例。该代码是可行的,因为List是Collection的子类。
现在考虑泛型,addAll的目标类型是Collection<? exends String>,而Arrays.asList返回了一个List<T>实例。在这个例子中,Java SE8编译器能够将类型变量T的值推断为String。编译器是由目标类型Collection<? extends String>推断出这个结果的。
Java SE8或更早版本的编译器则不能接受这样的代码,因为他们不能利用目标类型来判断方法调用参数的类型。例如,Java SE7编译器会生成类似如下的错误信息:
error: no suitable method found for addAll(List<Object>) ...method List.addAll(Collection<? extends String>) is not applicable (actual argument List<Object> cannot be converted to Collection<? extends String> by method invocation conversion)
因此,在类似这样的场景中,当Java编译器不能判断类型时,你必须用type witnesses显式指定类型变量的值。
例如,如下代码在Java SE7中是允许的:
List<String> stringList = new ArrayList<>();stringList.add("A");stringList.addAll(Arrays.<String>asList());See the following sections in the Java Tutorials for more information:
Target Typing inLambda Expressions
Type Inference
3. java类型注释:可以将注释用于任何用到类型的地方。这一特性与可插拔类型系统联合使用,允许对代码进行更强的类型检查。For more information, seeType Annotations and Pluggable Type Systems in the new Annotations lesson in the Java Tutorial.
4. 重复注释:可以将同一个注释类型在同一个声明或类型使用中应用多次。For more information, see Repeating Annotations in the new Annotations lesson in the Java Tutorial.
5. 方法参数反射:利用java.lang.reflect.Executable.getParameters, 可以获得任何方法或构造器的形式参数名。(类Method和Constructor继承自类Executable,因此继承了方法Executable.getParameters)。然而,.class文件默认情况下并不存储形式参数名。为了在一个特殊的.class文件中存储形式参数名,并因此启用Reflection API来检索形式参数名,要用javac编译器的-parameters选项编译源文件。SeeObtaining Names of Method Parameters in the Java Tutorials.
新闻热点
疑难解答