一、Java8新特性
  • Java8概述:Java8,也就是jdk1.8版本,是意义深远的一个新版本。是Java5之后一个大的版本升级,让Java语言和库仿佛获得了新生。
二、Lambda表达式
  • Lambda表达式:Lambda表达式,也可称为闭包。Lambda允许把函数作为一个方法的参数(函数作为参数传递进方法中)。直白说就是匿名内部类的一种精简写法,然后由JVM通过推导把简化的表达式还原。
  • Lambda格式:(parameters参数) -> expression表达式或方法体
  • Lambda规范:
  1. 使用Lambda前提是接口中只能有一个方法。
  2. 可以省略类型声明。
  3. 如果实现方法的表达式只有一行,可以省略大括号和return。
  4. 如果方法入参只有一个参数,则可以省略入参括号
  5. Lambda表达式只能引用标记了final的外层局部变量。
Lambda举例:
// 普通接口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是非线程安全的,所有的日期类都是可变的、)