简介
Lambda 表达式是 JDK8 的一个新特性,可以取代大部分的匿名内部类,写出更优雅的 Java 代码,尤其在集合的遍历和其他集合操作中,可以极大地优化代码结构。
对接口的要求
虽然使用 Lambda 表达式可以对某些接口进行简单的实现,但并不是所有的接口都可以使用 Lambda 表达式来实现。Lambda 规定接口中只能有一个需要被实现的方法,(接口中的抽象方法都是要必须被实现的)。不是规定接口中只能有一个方法,因为JDK8之前规定接口只能有抽象方法,不能有带方法体的方法。这里普及一下jdk不同版本规定接口里的内容
如果是Java 7,那么接口中可以包含的内容有:
- 常量
- 抽象方法
如果是Java 8,还可以额外包含有:
3. 默认方法
4. 静态方法
如果是Java 9,还可以额外包含有:
5. 私有方法
jdk 8 中有另一个新特性:default, 被 default 修饰的方法会有默认实现,不是必须被实现的方法,所以不影响 Lambda 表达式的使用。
接口使用步骤:
- 接口不能直接使用,必须有一个“实现类”来“实现”该接口。
格式:
public class 实现类名称 implements 接口名称 {
// ...
}
- 接口的实现类必须覆盖重写(实现)接口中所有的抽象方法。
实现:去掉abstract关键字,加上方法体大括号。 - 创建实现类的对象,进行使用。
接口的抽象方法
package cn.itcast.day10.demo01;
/*
在任何版本的Java中,接口都能定义抽象方法。
格式:
public abstract 返回值类型 方法名称(参数列表);
注意事项:
1. 接口当中的抽象方法,修饰符必须是两个固定的关键字:public abstract
2. 这两个关键字修饰符,可以选择性地省略。
3. 方法的三要素,可以随意定义。
*/
public interface MyInterfaceAbstract {
// 这是一个抽象方法
public abstract void methodAbs1();
// 这也是抽象方法
abstract void methodAbs2();
// 这也是抽象方法
public void methodAbs3();
// 这也是抽象方法
void methodAbs4();
}
必须通过实现类,来实现该接口,以上实现类覆盖重写了接口中所有抽象方法,只要有一个未重写,那么这个实现类自己就必须是抽象类。
@FunctinonalInterface 注解的作用
专门用来修饰函数式的接口,要求接口中的抽象方法只有一个,这个注解一般会和Lambda表达式一起使用
@FunctinonalInterface
public interface Test{
void method();//接口里只有一个必须实现的抽象方法
default void defaultMethod(){//实现类调用
System.out.println("这是默认方法,实现类不必强制实现");
}
static void staticMethod(){
System.out.println("这是静态方法,实现类无法继承");
}
}
//匿名内部类
public static void main(String[] args){
test t =new test(){ //test是一个接口
@Override
public void method(){
System.out.println("1222323");
}
};
t.method();
}
换成lambda表达式
public static void main(String[] args){
//无参无返回
test t=()->{
System.out.println("1222323");
}
t.method();
//带参数形式无返回
test t=(int a)->{
System.out.println("1222323"+a);
}
t.method(6);
}
//无参有返回值
test t=( )->{
System.out.println("1222323");
return 1;
}
int a=t.method();//接受他的返回值
}
//带参有返回
test t=(int a )->{
System.out.println("1222323"+a);
return 1;
}
int a=t.method(6);//接受他的返回值
}
lambda表达式简化
//简化参数类型,可以不写参数类型,但必须所有参数都不写
test t=(a,b)->{
System.out.println("1222323"+a+b);
}
t.method(6,7);
}
//简化参数小括号,如果只有一个参数,可以省略小括号
test t=a->{
System.out.println("1222323"+a);
}
t.method(6);
}
//简化方法体大括号,如果方法只有一条语句,则可以省略方法体大括号
test t=()->System.out.println("1222323");
t.method();
}
//如果方法体只有一条语句,并且是return语句,则可以省略方法体大括号
test t=a->a+3;
int c=t.method(5);
test t=(a,b)->a+b;
int c=t.method(5,6);