函数式接口Functional Interface是学习java8函数式编程的关键所在
简化方式丧心病狂,没学过的根本看不懂的
1、函数式接口的定义:一个任意的接口,接口中只含有一个抽象方法(),那它就是一个函数式接口。
比如:
//标准函数式接口:Runnable接口:实现此接口成为自定义线程类
public interface Runnable{
public abstract void run ();
}
2、对于函数式接口,我们可以使用lambda表达式来创建改接口的对象
lambda小测试一,代码是怎么一步步简化的:
package com.bes.mybatis_plus.TestLambda;
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、一步步简化,简化到java8新特性:用lambda简化函数式接口实现,
// 实现接口不写了,实现接口的方法不写了,直接写方法里要做的事就行了
// 能省就省,代码极致简化
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 !!!");
}
}
输出结果:
i like lambda !!!
i like lambda2 !!!
i like lambda3 !!!
i like lambda4 !!!
i like lambda5 !!!
lambda小测试二,当函数式接口的那个抽象方法带参数,该怎么写:
package com.bes.mybatis_plus.TestLambda;
public class TestLambda2 {
public static void main(String[] args) {
/**
* 接口名 接口对象 = (抽象方法的参数)->{
* 实现的方法体
* }
*/
//简化,去掉实现,去掉实现的抽象方法
/* ILove love = (int a)->{
System.out.println("I love you--> !!!" + a);
};*/
//再次简化,去掉参数类型,因为接口中定义了参数类型,这里定义参数名
/* ILove love = (a)->{
System.out.println("I love you--> !!!" + a);
};*/
//再再次简化,去掉括号,直接参数名加箭头,多个参数,参数名用括号括起来,中间用,隔开
/* ILove love = a->{
System.out.println("I love you--> !!!" + a);
};*/
//如果实现体只有一行代码,还可以再再再次简化!!!,连大括号都去掉,真尼玛变态(但是现实中一般用不着,因为一般不会只有一行代码)
//接口名 接口对象名 = 方法参数名 -> 方法实现体
// ILove love = a-> System.out.println("I love you--> !!!" + a);
//多个参数,方法名用括号括起来
ILove love = (a,str,isOK)->{
System.out.println("I love you--> !!!" + a +" " + str +" " + isOK);
};
/**
* 1、如果方法实现体有多行代码,则只能用上面那种简化方式
* 2、必须是函数式接口(接口里只有一个抽象方法)
* 3、多个参数也都可以去调参数类型,只保留参数名,但是要去掉就都去掉;参数名用括号括起来
*/
love.love(521, "潘狗子", true);
}
}
interface ILove{
//单个参数测试
// void love(int a);
//多个参数测试
void love(int a, String str, boolean isOK);
}
测试结果:
I love you--> !!!521
I love you--> !!!521 潘狗子 true
/** * 1、如果方法实现体有多行代码,则不能省略大括号 * 2、接口必须是函数式接口(接口里只有一个抽象方法) * 3、没有参数,就必须要一个括号再加箭头 * 4、多个参数也都可以去调参数类型,只保留参数名,但是要去掉就都去掉;参数名用括号括起来 */
函数式接口名 接口对象 = (参数名)->{
// 抽象方法实现体
}
缺点:可读性大大降低,很多人没学过直接看不懂,学过的也要熟悉了才能快速理解代码