Java 8 (又称 jdk1.8)是 Java 语言开发的一个主要版本。Oracle 公司 2014年3月18日 发布 Java 8,它支持函数式编程,新的 JavaScript 引擎,新的日期 API,新的 Stream API 等;
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 应用
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,可以直接在接口中定义方法体,子类都不用动。
函数式接口 就是一个有且仅有一个抽象方法,有且仅有一个抽象方法,但是 Object 类的 public 方法除外,default 和 static 是可以搞的;
JDK 1.8 新增加的函数接口:
java.util.function 此包中包含了很多类,用来支持 Java的 函数式编程
函数式接口注解
@FunctionalInterface
我们在函数式接口上面加上此注解后,里面就只能够有一个抽象方法了,当然不加此注解且只有一个抽象方法的接口也是函数式接口,只是没有限定提示而已。
简单的来说,可以看成是对匿名内部类的简写,使用 Lambda 表达式时,接口必须是函数式接口
特点 + 代码案例 :一个案例学会 Lambda
静态方法引用
构造方法引用
实例方法引用
代码案例:Java 8 方法引用 简单代码案例
Stream 使用一种类似 SQL 语句从数据库查询数据的直观方式来提供一种对 Java 集合运算和表达的高阶抽象;
这种风格将要处理的元素集合看作一种流, 流在管道中传输, 并且可以在管道的节点上进行处理, 比如筛选, 排序,聚合等。
常用方法 : 之前文章有代码示例!Java 8 Stream 常用方法 + 代码示例
以前的判断方式
<函数式接口> <变量名> = (参数1,参数2...) -> {
//方法体
}
引入 Optional 之后
@Test
public static String test8(UserPo user){
// 引入 Optional
return Optional.ofNullable(user).map(u -> u.getPassword()).orElse("unkonwn");
}
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);
}
页面更新:2024-04-29
本站资料均由网友自行发布提供,仅用于学习交流。如有版权问题,请与我联系,QQ:4156828
© CopyRight 2008-2024 All Rights Reserved. Powered By bs178.com 闽ICP备11008920号-3
闽公网安备35020302034844号