Lambda表达式
函数式接口
-
任何接口,如果只包含唯一一个抽象方法,那么它就是一个函数式接口
public interface Runnable{ public abstract void run(); }
-
对于函数式接口,我们可以通过lambda表达式来创建该接口的对象
Lambda表达式
-
推导Lambda表达式
/*
推导lambda表达式,从2到6,一步一步简化
*/
public class TestLambda1 {
//3、静态内部类
static class Like2 implements ILike{
@Override
public void lambda() {
System.out.println("i like lambda2");
}
}
public static void main(String[] args) {
ILike like =new Like();
like.lambda();
like=new Like2();
like.lambda();
//4、局部内部类
class Like3 implements ILike{
@Override
public void lambda() {
System.out.println("i like lambda3");
}
}
like=new Like3();
like.lambda();
//5、匿名内部类,没有类的名称,必须借助接口或父类
like=new ILike() {
@Override
public void lambda() {
System.out.println("i like lambda4");
}
};
like.lambda();
//6、用lambda简化(jdk8才出现),因为接口只有一个抽象方法,因此可以省略接口名和方法名
like=()->{
System.out.println("i like lambda5");
};
like.lambda();
}
}
//1、定义一个函数式接口
interface ILike{
void lambda();
}
//2、实现类
class Like implements ILike{
@Override
public void lambda() {
System.out.println("i like lambda");
}
}
-
简化Lambda表达式
public class TestLambda2 {
public static void main(String[] args) {
//lambda表达式
ILove love=(int a)->{
System.out.println("i love you"+a);
};
love.love(6);
//简化1:参数简化
love=(a)->{
System.out.println("i love you"+a);
};
love.love(7);
//简化2:简化括号
love=a->{
System.out.println("i love you"+a);
};
love.love(8);
//简化3:去掉花括号
love=a->System.out.println("i love you"+a);
love.love(9);
//总结:1、lambda表达式只能有一行代码的情况下才能简化成一行(去掉花括号),如果有多行,就用代码块包裹
//2、多个参数也可以去掉参数类型,要去掉都去掉,必须加上括号
}
}
interface ILove{
void love(int a);
}
- 使用Lambda必须具有上下文推断。 也就是方法的参数或局部变量类型必须为Lambda对应的接口类型,才能使用Lambda作为该接口的实例。
public class TestJoin{ public static void main(String[] args) throws InterruptedException { Thread thread=new Thread(()->{for (int i = 0; i < 1000; i++) { System.out.println("vip来了"+i);//因为new Thread()方法的参数是Runnable类型的,因此后面的lambda表达式是Runnable类型的实例,而不是其他类型的实例 }}); thread.start(); } }