函数式接口和@FunctionalInterface
函数式接口的特点
- 接口有且仅有一个抽象方法
- 允许定义静态方法和默认方法(这两个都不是抽象方法)
- 允许java.lang.Object中的public方法(因为任何一个函数式接口的实现,默认都继承了Object类)
- 添加@FunctionInterface注解会让编译器检查是否符合函数式接口的约束规范,但不是必须添加。没有添加时,只要符合以上规范也认为是一个函数式接口。
- 主要用在Lambda表达式和方法引用(实际上也可认为是Lambda表达式)上。
接口类型
Supplier型:无参数、有返回值
Consumer型:有参数、无返回值
Runnable型:无参数、无返回值
Function型:有参数、有返回值
JDK中的函数式方法举例
- java.lang.Runnable,
- java.awt.event.ActionListener,
- java.util.Comparator,
- java.util.concurrent.Callable
- java.util.function包下的接口,如Consumer、Predicate、Supplier等
用法举例
1.用来处理异常
先定义一个函数式接口
@FunctionalInterface
public interface ThrowExceptionHandler {
/**
* 抛出异常信息
* @param message
*/
void throwErrorMessage(String message);
}
再定义处理方法
public static ThrowExceptionHandler assertsTrue(boolean flag) {
return (errorMessage) -> {
if (!flag) {
throw new RuntimeException(errorMessage);
}
};
}
调用上述方法测试
assertsTrue(false).throwErrorMessage("抛出异常");
2.用来处理分支
先定义一个函数式接口
@FunctionalInterface
public interface BranchHandler {
/**
* 分支判断
* @param trueHandler
* @param falseHandler
*/
void trueOrFalseHandler(Runnable trueHandler, Runnable falseHandler);
}
再定义一个处理方法
public static BranchHandler isTrueOrFalse(boolean flag) {
return (trueHandler, falseHandler) -> {
if (flag) {
trueHandler.run();
} else {
falseHandler.run();
}
};
}
调用上述方法测试
isTrueOrFalse(true).trueOrFalseHandler(
() -> { System.out.println("true"); },
() -> { System.out.println("false"); }
);