Java8特性
一、函数式接口
接口的作用:用于定义规范,强调当前类应该实现哪些方法,不负责实现。
常规接口:用interface关键字定义的接口(可以包含零个或多个抽象方法)-
函数式接口:(Functional Interface)就是一个有且仅有一个抽象方法的接口。
- @FunctionalInterface //该注解声明当前接口为一个“函数式接口”
- 函数式接口的实例可以通过 lambda 表达式、方法引用或者构造方法引用来创建。
- 如果某个接口只有一个抽象方法,但我们并没有给该接口声明
@FunctionalInterface
注解,那么编译器依旧会将该接口看作是函数式接口 - 总结:函数式接口就是只显式声明一个抽象方法的接口。 为保证方法数量不多不少,java8提供了一个专用注解 @FunctionalInterface。 函数式接口可以包含默认方法(default)。
/* 函数式接口 *1.有且仅有1个抽象方法 */ @FunctionalInterface //该注解声明当前接口为一个“函数式接口” public interface MyFunctionalInterface { //有且仅有1个抽象方法:只允许有1个抽象方法 public void dosth(int x); public default void doSth(){ } //可以包含默认方法 }
- 重写 Object 类里的方法不会导致函数式接口失效
如果一个接口声明了抽象方法,但该抽象方法重写了 Object 类里的一个公有方法,那么对于 Java 编译器来 说,它并不会认为该方法符合函数式接口的抽象方法(即不把该方法当作函数式接口的抽象方法)。因为接口的实现类都会直接或间接继承 Object 这个根类,所以在函数式接口中定义与 Object 类中签名一样的方法是不会导致函数式接口失效的。
举例的接口声明为函数式接口,并重写了
toString()
这个Object()
方法,但是并不会报错:
@FunctionalInterface
public interface MyInterface {
void test();
String toString();
}
- JDK 1.8 之前已有的函数式接口:
java.lang.Runnable
java.util.Comparator
......
- JDK1.8新增的函数式接口:
java.util.function
二、Lambda表达式
1.语法:
• "—>" 被称为 Lambda 操作符或箭头操作符。它将 Lambda 分为两个部分。
• 左侧: 指定了 Lambda 表达式需要的方法参数列表。
• 右侧: 指定了 Lambda 体,即 Lambda 表达式要执行的功能。
( parameters ) -> expression
( parameters ) -> { statements; }
2.函数式接口可以被隐式转换为 lambda 表达式。
Lambda 表达式和方法引用(实际上也可认为是Lambda表达式)上。
/*
* 函数式接口
*1.有且仅有1个抽象方法
*/
@FunctionalInterface //该注解声明当前接口为一个“函数式接口”
public interface MyFunctionalInterface {
//有且仅有1个抽象方法:只允许有1个抽象方法
public void dosth(int x);
}
//"匿名实现类":该类函数式接口MyFunctionalInterface进行"匿名实现"【相同语法】
MyFunctionalInterface mfn1=new MyFunctionalInterface() {
public void dosth(int x) {
System.out.println(x*1024);
}
};
mfn1.dosth(10);
- 那么就可以使用Lambda表达式来表示该接口的一个实现(注:JAVA 8 之前一般是用匿名类实现的):
//"匿名实现类":该类函数式接口MyFunctionalInterface进行"匿名实现"【java8的新语法】
//"->代表推导"
MyFunctionalInterface mfn2=(int x)->{System.out.println(x*10);};
mfn2.dosth(10);
Lambda表达式的运用pdf上