首先普及一下函数式接口:只有一个方法的接口称为函数式接口。
我们定义一个接口,定义一个实现类(与所在文件的类平级),如下图,我们可以实现这个接口:
package com.sxj;
public class TestLambda {
public static void main(String args[]){
Like like = new Like();
like.lambda();
}
}
// 1.定义一个函数式接口
interface ILike {
void lambda();
}
// 2.定义一个实现类
class Like implements ILike {
@Override
public void lambda() {
System.out.println("i like lambda");
}
}
我们逐步简化这个功能。这个实现类也可以定义为静态内部类(处于所在文件TestLambda类中,与main方法平级)同样可以实现,如下:
package com.sxj;
public class TestLambda {
// 3.定义一个静态内部类
static class Like implements ILike {
@Override
public void lambda() {
System.out.println("i like lambda");
}
}
public static void main(String args[]) {
Like like = new Like();
like.lambda();
}
}
// 1.定义一个函数式接口
interface ILike {
void lambda();
}
接着简化,我们把这个类定义成局部内部类(写到main方法里面):
package com.sxj;
public class TestLambda {
public static void main(String args[]) {
// 4.定义一个局部内部类
class Like implements ILike {
@Override
public void lambda() {
System.out.println("i like lambda");
}
}
Like like = new Like();
like.lambda();
}
}
// 1.定义一个函数式接口
interface ILike {
void lambda();
}
继续简化,把这个类改为匿名内部类(没有类名,用到的时候再定义,用一次定义一次),如下:
package com.sxj;
public class TestLambda {
public static void main(String args[]) {
// 5.定义一个匿名内部类,没有类名
ILike like = new ILike() {
@Override
public void lambda() {
System.out.println("i like lambda");
}
};
like.lambda();
}
}
// 1.定义一个函数式接口
interface ILike {
void lambda();
}
继续简化,JDK1.8后可以用lambda表达式(反正函数式接口中只有一个方法,我又为什么要说调用的是哪个,我要调哪个你JDK还能不知道吗?):
package com.sxj;
public class TestLambda {
public static void main(String args[]) {
// 6.lambda表达式
ILike like = ()-> {
System.out.println("i like lambda");
};
like.lambda();
}
}
// 1.定义一个函数式接口
interface ILike {
void lambda();
}