一、什么是函数式接口?
-
有且仅有一个抽象方法
,可以有多个非抽象方法的接口。 -
函数式接口可以被隐式转换为
lambda表达式
,同时对lambda表达式支持非常友好。 -
函数式接口可以用
@FunctionalInterface
注解标注。
二、用于什么样的场景?
-
适用于对条件和需求都明确,直接了当要做什么或者达到什么样的目的的场景。
-
理解:
条件(有什么)和需求(干什么)抽取出来,过程(怎么干)先不谈。
三、解决了什么样的问题?
- 在特殊的场景中函数式编程思想
解决了面相对象
编程思想对类的高度依赖问题
,让编程过程变得更简洁。
四、函数式编程如何实现?
1.自定义一个函数接口
package com.mollen.demo01;
/**
* @ClassName: MyInterface
* @Auther: Mollen
* @CreateTime: 2018-09-11 22:40:01
* @Description:
* 函数式接口:有且仅有一个抽象方法的接口
* 编程思想:需求====>结果
*
*/
@FunctionalInterface
public interface MyInterface {
public abstract void method();
}
2.便于理解和传统实现方式的比较,定义一个接口实现类
package com.mollen.demo01;
/**
* @ClassName: MyInterfaceImpl
* @Auther: Mollen
* @CreateTime: 2018-09-11 22:43:51
* @Description:
* 只是一个普通的接口实现类
*/
public class MyInterfaceImpl implements MyInterface {
@Override
public void method() {
System.out.println("通过实现类来实现函数式接口!");
}
}
3、定义一个测试类
package com.mollen.demo01;
/**
1. @ClassName: Test
2. @Auther: Mollen
3. @CreateTime: 2018-09-11 22:41:52
4. @Description:
5. A、 函数式接口实现方式:
6. 1、实现类
7. 2、匿名内部类
8. 3、lambda表达式(JDK8 特性)
9. B、lambda表达式:
10. 1、定义:有且仅有一个抽象方法的接口
11. 2、格式:()->{}
12. 3、简写:当()参数只有一个,{}只有一条语句,可省略参数和{}
13. 比如:()->System.out.print()
*/
public class Test {
public static void main(String[] args) {
/**
* 1.接口实现类实现接口
*/
show(new MyInterfaceImpl());
/**
* 2.匿名内部类实现接口
*/
show(new MyInterface() {
@Override
public void method() {
System.out.println("通过匿名内部类的方式实现函数式接口");
}
});
/**
* 3.lambda表达式实现函数式接口
*/
show(()->System.out.println("lambda表达式实现函数式接口"));
}
/**
* 函数式接口作为参数传递进行方法调用
*/
public static void show(MyInterface myInterface){
myInterface.method();
}
}
五、注意事项
-
@FunctionalInterface
注解是校验函数式接口的标志,按规范函数式接口都标注。 -
函数式接口可以有
非抽象方法
,jdk1.8
之后可以有静态方法(static
)方法和默认(default
)方法,jdk1.9
以后可以有私有(private
)方法。 -
lambda表达式简化规则,后续再聊。