什么是函數(shù)式接口
所謂的函數(shù)式接口,當(dāng)然首先是一個(gè)接口,然后就是在這個(gè)接口里面只能有一個(gè)抽象方法。
這種類型的接口也稱為SAM接口,即Single Abstract Method interfaces
特點(diǎn)
- 接口有且僅有一個(gè)抽象方法
- 允許定義靜態(tài)方法
- 允許定義默認(rèn)方法
- 允許java.lang.Object中的public方法
- 該注解不是必須的,如果一個(gè)接口符合"函數(shù)式接口"定義,那么加不加該注解都沒有影響。加上該注解能夠更好地讓編譯器進(jìn)行檢查。如果編寫的不是函數(shù)式接口,但是加上了@FunctionInterface,那么編譯器會報(bào)錯(cuò)
例子
// 正確的函數(shù)式接口
@FunctionalInterface
public interface TestInterface {
// 抽象方法
public void sub();
// java.lang.Object中的public方法
public boolean equals(Object var1);
// 默認(rèn)方法
public default void defaultMethod(){
}
// 靜態(tài)方法
public static void staticMethod(){
}
}
// 錯(cuò)誤的函數(shù)式接口(有多個(gè)抽象方法)
@FunctionalInterface
public interface TestInterface2 {
void add();
void sub();
}
用法
- Runnable的用法
- 公司組內(nèi)的用法介紹
/**
* 真正的業(yè)務(wù)處理
*/
@FunctionalInterface
public static interface RequestExecutor {
Object doExecute() throws BusinessException;
}
/**
* 請求模板
*/
public void templateRequest(RequestExecutor executor) {
// 獲取response對象
HttpServletResponse response =
((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getResponse();
try {
Object result = executor.doExecute();
writeAjaxJSONResponse(ResultMessageBuilder.build(true, "success!", result), response);
} catch (Exception e) {
logger.error("請求失敗", e);
writeAjaxJSONResponse(ResultMessageBuilder.build(false, 500, "系統(tǒng)異常"), response);
}
}
/**
* controller部分代碼
*/
@PostMapping(path = "/pageQuery")
public void pageQuery(@RequestBody Query query) {
templateRequest(() -> service.pageQuery(query));
}
/**
* service部分代碼
*/
public PagedResult<VO> pageQuery(Query query);
JDK中的函數(shù)式接口舉例
java.lang.Runnable,
java.awt.event.ActionListener,
java.util.Comparator,
java.util.concurrent.Callable
java.util.function包下的接口,如Consumer、Predicate、Supplier等