1.主要新特性
Lambda 表达式 – Lambda 允许把函数作为一个方法的参数【函数作为参数传递进方法中】
方法引用 – 方法引用提供了非常有用的语法,可以直接引用已有 Java 类或对象(实例)的方法或 构造器 ,更加紧凑简洁,减少冗余代码
默认方法 – 默认方法就是一个在接口里面有了一个实现的方法
新工具 – 新的编译工具,如:Nashorn 引擎 jjs、类依赖分析器 jdeps
Stream API – 新添加的 Stream API (java.util.stream)把真正的函数式编程风格引入到 Java 中
Date Time API – 加强对日期与时间的处理
Optional 类 – Optional 类已经成为 Java 8 类库的一部分,用来解决空指针异常
Nashorn,Java Script 引擎 – Java 8 提供了一个新的 Nashorn javascript 引擎,它允许我们在 JVM 上运行特定的 javascript 应用
2.接口的默认方法
static 方法
1、使用static修饰接 口中的方法并且必须有主体 ;
2、接口的static方法只能够 被接口本身调用;接口名.方法名(…);
3、接口的static方法 不能够被子接口继承;
4、接口的static方 法不能够被实现类覆写及直接调用;
default方法
在接口中可以定义一个使用default修饰有方法体的方法,接口中可以对这个方法提供默认的一种实现。
1、使用default修饰接口中的方法并且 必须 有主体;
2、接口的default方法不能够被接口本身调用,需要接口的 实例(实现类对象)来调用 ;
3、接口的default方法 可以被子接口继承、覆写或者直接调用 ;
4、接口的default方法可以被实现类覆写及直接调用;
在接口中,经过static和default修饰的方法必须有方法体;
static修饰的方法调用方式为类.方法名
default修饰的方法必须是实现类的对象调用
static修饰的方法不能被子接口继承,default修饰的方法可以被子接口继承
并复写方法,就可以创建子接口实现类对象进行调用
使用static和default有什么好处:
Default:类似于抽取,可以多个实现类的统一的业务都抽取到default方法体体实现:
1:接口里写了方法体,所有的实现类和子类都拥有这个方法,都可以调用,不用再每一个都覆写;
2: 我们已经开发好功能了,突然要增加需求,原始的方法:接口定义一个抽象方法,每一个实现去写实现类;现在,使用defaul,可以直接在接口中定义方法体,子类都不用动。
3.函数式接口
函数式接口 就是一个有且仅有一个抽象方法,有且仅有一个抽象方法,但是 Object 类的 public 方法除外,default 和 static 是可以搞的;
JDK 1.8 新增加的函数接口:
java.util.function 此包中包含了很多类,用来支持 Java的 函数式编程
函数式接口注解
@FunctionalInterface
我们在函数式接口上面加上此注解后,里面就只能够有一个抽象方法了,当然不加此注解且只有一个抽象方法的接口也是函数式接口,只是没有限定提示而已。
4.Lambda 表达式
简单的来说,可以看成是对匿名内部类的简写,使用 Lambda 表达式时,接口必须是函数式接口
特点 + 代码案例 :
5.方法引用
静态方法 引用
构造方法 引用
实例方法引用
代码案例:
6.Java 8 Stream
Stream 使用一种类似 SQL 语句 从数据库查询数据的直观方式来提供一种对 Java 集合运算和表达的高阶抽象;
这种风格将要处理的 元素集合看作一种流 , 流在管道中传输, 并且可以在管道的节点上进行处理, 比如 筛选, 排序,聚合 等。
常用方法 : 之前文章有代码示例!
7.Optional 实例
以前的判断方式
<函数式接口> <变量名> = (参数1,参数2...) -> {
//方法体
}
引入 Optional 之后
@Test
public static String test8(UserPo user){
// 引入 Optional
return Optional.ofNullable(user).map(u -> u.getPassword()).orElse("unkonwn");
}
8.本地化日期时间 API
Java 8通过发布新的Date-Time API (JSR 310)来进一步加强对日期与时间的处理。
@Test
public void test9(){
// 处理时区不是必须的情况 获取当前的日期时间
LocalDateTime currentTime = LocalDateTime.now();
System.out.println("当前时间: " + currentTime);
LocalDate date1 = currentTime.toLocalDate();
System.out.println("date1: " + date1);
Month month = currentTime.getMonth();
int day = currentTime.getDayOfMonth();
int seconds = currentTime.getSecond();
System.out.println("月: " + month +", 日: " + day +", 秒: " + seconds);
System.out.println("");
System.out.println("==============================");
System.out.println("");
// 使用时区的日期时间API 获取当前时间日期
ZonedDateTime dd= ZonedDateTime.now();
System.out.println(dd);
ZonedDateTime date2 = ZonedDateTime.parse(dd.toString());
System.out.println("date1: " + date2);
ZoneId id = ZoneId.of(ZoneId.SHORT_IDS.get("CTT"));
System.out.println("ZoneId: " + id);
ZoneId currentZone = ZoneId.systemDefault();
System.out.println("当期时区: " + currentZone);
}