函数式接⼝@FunctionalInterface使⽤⽰例
通过JDK8源码javadoc,可以知道@FunctionalInterface有以下特点:
该注解只能标记在"有且仅有⼀个抽象⽅法"的接⼝上,表⽰函数式接⼝。
JDK8接⼝中的静态⽅法和默认⽅法,都不算是抽象⽅法。
接⼝默认继承java.lang.Object,所以如果接⼝显⽰声明覆盖了Object中的⽅法,那么也不算抽象⽅法。
该注解不是必须的,如果⼀个接⼝符合"函数式编程"定义,那么加不加该注解都没有影响。加上该注解能够更好地让编译器进⾏检查,如果编写的不是函数式接⼝,但是加上了@FunctionalInterface 那么编译器会报错。
代码说明:使⽤Lambda表达式。⼀般的格式是 ()->{} ,如果{}⾥⾯只有⼀⾏代码,则{}可以省略。 (->左边的()表⽰⽅法体,如果有形参,则在()中添加形参,->右边{}表⽰具体逻辑。如果⽅法体返回值是void,则甚⾄可以在{}中不写任何逻辑(当然也要结合场景)。返回值如果有值,则需要写具体的逻辑,return处理后的值。)理解这⾥⾮常重要
演⽰⼀、请求参数、返回参数均有值的接⼝
package com.calvin.currency.function;
/**
* @Title CustomFuctionInterface
* @Description ⾃定义函数式接⼝之演⽰⼀、请求参数、返回参数均有值的接⼝
* @author calvin
* @date: 2020/3/3 1:02 AM
*/
@FunctionalInterface
public interface CustomFuctionInterface {
String printStr(String str1, String str2);
}
代码测试
@Test
public void test1(){
CustomFuctionInterface customFuctionInterface =(str1, str2)->"hello "+ str1 + str2; String printStr = customFuctionInterface.printStr("A&","B");
System.out.println("printStr = "+ printStr);
}
控制台输出结果:
演⽰⼆、请求参数没有值、返回参数有值的接⼝
package com.calvin.currency.function;
/**
* @Title CustomFuctionInterface
* @Description ⾃定义函数式接⼝之演⽰⼆、请求参数没有值、返回参数有值的接⼝
* @author calvin
* @date: 2020/3/3 1:06 AM
*/
@FunctionalInterface
public interface CustomFuctionInterface2 {
String printStr();
}
代码测试
@Test
public void test2(){
CustomFuctionInterface2 customFuctionInterface2 =()->"hello world";
String printStr = customFuctionInterface2.printStr();
System.out.println("printStr = "+ printStr);
}
控制台输出结果:
演⽰三、实际项⽬中可借鉴使⽤(落地)
/**
* @Title CustomFuctionInterface
* @Description ⾃定义函数式接⼝之演⽰三、实际项⽬中可借鉴使⽤(落地)
* @author calvin
* @date: 2020/3/3 1:25 AM
*/
@FunctionalInterface
public interface CustomFuctionInterface3 {
void doSomething();
}
假设现在某个类的某个⽅法形参为CustomFuctionInterface3,如代码所⽰:
public static void execute(CustomFuctionInterface3 interface3){
interface3.doSomething();
}
传统的调⽤⽅法 :
@Test
public void test3(){
execute(new CustomFuctionInterface3(){
@Override
public void doSomething(){
System.out.println("");
lambda编程}
});
}
控制台输出结果:
通过Lambda表达式改进以上测试代码:
@Test
public void test3(){
execute(()-> System.out.println(""));
}
再次查看控制台输出结果:
可以发现结果是⼀致的,代码看起来更加简洁美观。
总结: 以上⼏个⼩案例,通过使⽤函数式接⼝@FunctionalInterface+Lambda表达式进⾏了代码演⽰,对于我们理解函数式编程的思想以及并发⼯具包JUC下的函数型、断定型、消费者、供给型等接⼝的源码阅读都有⼀定的帮助。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论