一、Java8新特性
- Java8概述:Java8,也就是jdk1.8版本,是意义深远的一个新版本。是Java5之后一个大的版本升级,让Java语言和库仿佛获得了新生。
二、Lambda表达式
- Lambda表达式:Lambda表达式,也可称为闭包。Lambda允许把函数作为一个方法的参数(函数作为参数传递进方法中)。直白说就是匿名内部类的一种精简写法,然后由JVM通过推导把简化的表达式还原。
- Lambda格式:(parameters参数) -> expression表达式或方法体
- Lambda规范:
- 使用Lambda前提是接口中只能有一个方法。
- 可以省略类型声明。
- 如果实现方法的表达式只有一行,可以省略大括号和return。
- 如果方法入参只有一个参数,则可以省略入参括号
- Lambda表达式只能引用标记了final的外层局部变量。
// 普通接口public interface MathOperation { int operation(int a, int b); }
// Lambda测试类public static void main(String args[]) { // 普通匿名内部类 StringOperation a = new StringOperation() { @Override public String operation(String msg) { return msg + "Lambda"; } }; // Lambda表达式完整版本 StringOperation b = (String msg) -> { return msg + "Lambda"; }; // 省略类型声明:JVM会自动匹配 StringOperation c = (msg) -> { return msg + "Lambda"; }; // 省略方法体:前提是方法实现只能有一行代码 StringOperation d = (msg) -> msg + "Lambda"; // 省略入参括号:前提是方法只有一个入参 StringOperation e = msg -> msg + "Lambda"; }
五、默认方法
- 默认方法:Java8新增了接口的默认方法。简单说,默认方法就是接口可以有实现方法,而且不需要实现类去实现其方法。我们只需在方法名前面加个default关键字即可实现默认方法。
六、Optional类
- Optional类:Optional类是个容器,它可以保存类型T的值,或者仅仅保存NULL。Optional提供很多有用的方法,这样我们就不用显式进行空值检测。如果值存在则isPresent()方法会返回true,调用get()方法会返回该对象。Optional类的引入很好的解决空指针异常。
// Optional类测试代码public static void main(String args[]) { Integer value1 = null; Integer value2 = new Integer(10); // Optional.ofNullable() 允许传递为 null 参数 Optionala = Optional.ofNullable(value1); // Optional.of() 如果传递的参数是 null,抛出异常 NullPointerException Optionalb = Optional.of(value2); // Optional.isPresent() 判断是否为NULL,为NULL返回false boolean aAresent = a.isPresent(); boolean bAresent = b.isPresent(); // Optional.orElse() 获取值,为NULL使用默认值(5)。 Integer aOrElse = a.orElse(new Integer(5)); // Optional.get() 获取值,为NULL抛异常。 Integer integer = a.get(); }
七、Nashorn JavaScript
- Nashorn JavaScript:从JDK1.8开始,Nashorn取代Rhino(JDK 1.6, JDK1.7)成为Java的嵌入式JavaScript引擎。Nashorn完全支持ECMAScript 5.1规范以及一些扩展。它使用基于JSR292的新语言特性,其中包含在JDK 7中引入的invokedynamic,将JavaScript编译成Java字节码。与先前的Rhino实现相比,这带来了2到10倍的性能提升。
- Nashorn JavaScript举例:
// Nashorn JavaScript测试方法public static void main(String args[]) { // 获取JavaScript执行器 ScriptEngine nashorn = new ScriptEngineManager().getEngineByName("nashorn"); try { // 调用脚本 Object eval = nashorn.eval("print('test')"); // 调用脚本并获取返回值 Integer result = (Integer) nashorn.eval("10 + 2"); } catch (ScriptException e) { e.printStackTrace(); } }
八、日期时间 API
- 日期时间:Java 8通过发布新的Date-Time API (JSR 310)来进一步加强对日期与时间的处理。在旧版的Java 中,日期时间API存在诸多问题(java.util.Date是非线程安全的,所有的日期类都是可变的、)