1.Lambda 表达式 − Lambda允许把函数作为一个方法的参数(函数作为参数传递进方法中。
2.方法引用 − 方法引用提供了非常有用的语法,可以直接引用已有Java类或对象(实例)的方法或构造器。与lambda联合使用,方法引用可以使语言的构造更紧凑简洁,减少冗余代码。
3.默认方法 − 默认方法就是一个在接口里面有了一个实现的方法。
4.新工具 − 新的编译工具,如:Nashorn引擎 jjs、 类依赖分析器jdeps。
5.tream API −新添加的Stream API(java.util.stream) 把真正的函数式编程风格引入到Java中。
6.Date Time API − 加强对日期与时间的处理。
7.Optional 类 − Optional 类已经成为 Java 8 类库的一部分,用来解决空指针异常。
8.Nashorn, JavaScript 引擎 − Java 8提供了一个新的Nashorn javascript引擎,它允许我们在JVM上运行特定的javascript应用。
接口定义增强
在jdk1.8开始可以在接口定义default关键字 定义普通方法 使用静态
public interface UserService {
/**
* 定义的静态变量子类是可以继承
*/
static int age = 28;
void addUser(); // 抽象方法
/**
* jdk 1.8 新特性 能够在接口中使用default书写普通方法 定义静态方法
*
* @param userId
* @return
*/
default String getUser(Integer userId) {
return "蚂蚁课堂牛逼!";
}
/**
* 使用静态定义的方法 不会被子类继承的 只能通过类名.方法
*/
static void staticUser() {
System.out.println("我是静态的User..");
}
}
子类是可以重写父类的默认方法 直接覆盖
public class UserServiceImpl implements UserService {
@Override
public void addUser() {
System.out.println("添加我们的user");
}
@Override
public String getUser(Integer userId) {
return "userid:" + userId;
}
}
函数式接口
两种实现的方式:
1.在接口中定义唯一一个的抽象方法
2. @FunctionalInterface
1.两者实现起来并不冲突的,注解的作用主要的目的是为了强制约定一个接口只允许有一个抽象的方法
2.唯一一个抽象方法:可以存在static方法和default普通方法
常用的函数接口有哪些:
多线程中:Runnable 也是一个函数接口 只有一个run抽象方法
Java排序类 Comparator接口
传统使用匿名内部类调用接口
/**
* 该接口就是为函数的接口
*/
@FunctionalInterface
public interface MemberFunctionService {
String addMember(String userName);
}
// 1.属于JDK1.8之前使用匿名内部的形式调用我们的接口
MemberFunctionService memberFunctionService = new MemberFunctionService() {
@Override
public String addMember(String userName) {
System.out.println(">>>addMember<<<");
return "userName" + userName;
}
};
String result = memberFunctionService.addMember("youth");
System.out.println("result:" + result);
使用Lambda表达式调用接口
MemberFunctionService memberFunctionService2 = (userName) -> {
return "userName:" + userName;
};
String reuslt2 = memberFunctionService2.addMember("youth");
System.out.println("reuslt2:" + reuslt2);
Lambda 表达式的作用:
简化匿名内部类的代码