匿名内部类可以实现一个接口的对象,注意是接口的对象,直接实现接口的抽象方法(所有),然后使用,因为没有经过“类”这一环节,所以叫匿名类,即认为这一对象属于某个不具名的类,这样的过程自然就不能用这个“不具名的类”再产生其他对象,故只能产生这一个对象
函数式接口,首先是一个接口,然后接口里只有一个抽象方法,其他随意,抽象方法只能有一个。
这时可以用lambda表达式来创建函数式接口,lambda表达式负责实现那个唯一的抽象方法。
package Chapter6;
interface FuncInter
{
int Function(int[] args);
}
public class InterLambda
{
public int Proc(int[] args,FuncInter Func)
{
return Func.Function(args);
}
public static void main(String[] args)
{
int[] arry = {1,5,9};
//匿名内部类先创建对象再实现
FuncInter f = new FuncInter() {
@Override
public int Function(int[] args) {
// TODO Auto-generated method stub
int sum = 0;
for(int temp : args)
{
sum += temp;
}
return sum;
}
};
System.out.println(new InterLambda().Proc(arry, f));
//匿名内部类直接实现
System.out.println(new InterLambda().Proc(arry, new FuncInter() {
@Override
public int Function(int[] args) {
// TODO Auto-generated method stub
int sum = 0;
for(int temp : args)
{
sum += temp;
}
return sum;
}
}));
//lambda表达式直接实现
System.out.println(new InterLambda().Proc(arry, (int[] as) ->{
int sum = 0;
for(int temp : as)
{
sum += temp;
}
return sum;
})
);
//先用Lambda表达式创建一个函数式接口的实例,再调用
FuncInter ff = (int[] as) ->{
int sum = 0;
for(int temp : as)
{
sum += temp;
}
return sum;
};
System.out.println(new InterLambda().Proc(arry, ff));
}
}
注意,从接口中的抽象方法,到类方法的实现,再到lambda表达式, 返回值要统一