java的函数式接口包括Supplier,Function,BiConsumer,BiFunction等接口
函数式接口类似于c++里的函数指针
Supplier相当于指定返回参数类型的无输入参数方法(定义上必须是静态方法)
Function相当于指定返回参数类型的无输入参数方法(定义上必须是类的公共方法方法)
BiConsumer相当于无返回参数类型的一个输入参数方法(定义上必须是类的公共方法方法)
BiFunction相当于指定返回参数类型的一个输入参数方法(定义上必须是类的公共方法方法)
如果存在多个输入参数,可以定义多个参数的接口
public interface TwoParamFunction<T, U, K,R> {
R apply(T t, U u, K k);
}
public class Test {
public static String testSupplier(){
return "Supplier";
}
public String testFunction(){
return "Function";
}
public void testBiConsumer(Integer i){
i++;
}
public String testBiFunction(Integer i){
return String.valueOf(i++);
}
public String testTwoParamFunction(Integer i,Long l){
return String.valueOf(i+l);
}
void main(){
Supplier<String> supplier = Test::testSupplier;
String result = supplier.get();
int i = 0;
long l = 1;
Test test = new Test();
Function<Test,String> function = Test::testFunction;
result = function.apply(test);
BiConsumer<Test,Integer> biConsumer = Test::testBiConsumer
biConsumer.accept(test,i);
BiFunction<Test,Integer,String> biFunction = Test::testBiFunction
result = biFunction.apply(test,i);
TwoParamFunction<Test,Integer,Long,String> twoParamFunction = Test::testTwoParamFunction
result = twoParamFunction.apply(test,i,l);
testEnum(test,2);
}
statuc void testEnum(Test test,Integer i){
BaseEnum baseEnum = BaseEnum.getByCode(i);
baseEnum.function..apply(test,i);
}
}
应用范围,可以减少条件判断
例如枚举
public enum BaseEnum {
ONE(1,"one",Test::testBiFunction),TWO(2,"two",Test::testBiFunction);
private BaseEnum(Integer code,String name,Function<Test,Integer> function){
this.code = code;
this.name = name;
this.function = function
}
Integer code;
String name;
Function<Test,Integer> function;
public static BaseEnum getByCode(Integer type) {
for (BaseEnum value : values()) {
if (value.getType().equals(type)) {
return value;
}
}
return null;
}
}