函数式接口规范
1、@FunctionalInterface标识为一个函数式接口只能用在只有一个抽象方法的接口上。
2、接口中的静态方法、默认方法、覆盖了Object类的方法都不算抽象方法。
3、@FunctionalInterface注解不是必须的,如果该接口只有一个抽象方法可以不写,它默认就符合函数式接口,但建议都写上该注解,编译器会检查该接口是否符合函数式接口的规范。
自定义函数式接口
//一个简单的函数式接口定义
@FunctionalInterface
public interface MyInterface<N,V>{
V operation(N n1,N n2);
}
//带默认方法和静态方法的函数式接口定义
@FunctionalInterface
public interface MyInterface<N,V>{
V operation(N n1,N n2);
public boolean equals(Object object);
public default void defaultMethod(){
}
public static void staticMethod(){
}
}
函数式接口使用方式
public static class NumberOperation<N extends Number, V extends Number>{
private N n1;
private N n2;
public NumberOperation(N n1,N n2){
this.n1 =n1;
this.n2 =n2;
}
//作为方法参数使用
public V calc(MyInterface<N,V> mf){
V v =mf.operation(n1,n2);
return v;
}
}
使用测试
private static void test(){
NumberOperation<Integer,Integer>np =new NumberOperation(11,20);
MyInterface<Integer,Integer> addOper1 =(n1,n2)->{
return n1 +n2;
};
MyInterface<Integer,Integer> multiOper1 =(n1, n2)->{
return n1 * n2;
};
System.out.println(np.calc1(addOper1));
System.out.println(np.calc1(multiOper1));
//也可以使用Lambda表达式来表示该接口的一个实现
System.out.println (np.calc1((n1, n2)-> n1 + n2));
System.out.println(np.calc1((n1, n2)-> n1 * n2));
}