当匿名内部类只有一个中有且只有一个抽象方法时,可以更加匿名内部类写法,编程lamada表达式。
例如,有这样一个例子:
先写一个接口,接口中只有一个抽象方法
public interface AbstractLambda { int sayHi( int a); }
再写一个A类写一个方法doSome,方法形参为这个接口的一个引用,再写一个接口的实现类,实现类重写抽象方法,写一个测试类,new一个实现类的实例,new一个A类的实例a,通过a调用doSome方法,传入实现类的实例。
public class Test { public static void main(String[] args) { A a = new A(); RealLambda r = new RealLambda(); a.doSome(r); } } class A{ public void doSome(AbstractLambda al) { al.sayHi(4);
} } class RealLambda implements AbstractLambda{ @Override public int sayHi(int a) { System.out.println("AbstractLambda的一个实现类重写的sayHi方法");
return a; } }
以上代码,在a.doSome(r)部分,由于r只使用一次,我们可以使用匿名内部类代替r,这样就不用写接口的实现类了,如下:
public class Test { public static void main(String[] args) { A a = new A(); a.doSome(new AbstractLambda() {//改变的地方 @Override public int sayHi(int a) { System.out.println("匿名内部类中的重写抽象方法实现了运行了");
return 0; } }); } } class A{ public void doSome(AbstractLambda al) { System.out.println("传入lambda表达式的方法运行了"); } }
接下来我们将a.doSome()使用lambda进一步精简:
使用lambda的规则是:该抽象类有且仅有一个抽象方法。
精简步骤是:
- 去掉方法参数列表以前的方法部分,只保留方法的参数列表(与括号,且参数名也要写,参数类型可以不写)
- 参数列表后面加“->{ }”,在大括号中填入语句,这些语句就代表这个抽象方法中的语句。
- 如果大括号中只写一句,可省略大括号,省略后要将这句的分号去掉,如有return,可省略return。
- 参数列表里不能穿实参啊那是形参声明
-
public class Test { public static void main(String[] args) { A a = new A(); //初始lambda形式 a.doSome((int b)->{ return 0; }); //去掉参数类型,方法体中若只有一句,所以去掉大括号,去掉分号,去掉return。 a.doSome((b)-> 0); } }