83 lambda表达式

当匿名内部类只有一个中有且只有一个抽象方法时,可以更加匿名内部类写法,编程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的规则是:该抽象类有且仅有一个抽象方法。

精简步骤是:

  1. 去掉方法参数列表以前的方法部分,只保留方法的参数列表(与括号,且参数名也要写,参数类型可以不写)
  2. 参数列表后面加“->{ }”,在大括号中填入语句,这些语句就代表这个抽象方法中的语句。
  3. 如果大括号中只写一句,可省略大括号,省略后要将这句的分号去掉,如有return,可省略return。
  4. 参数列表里不能穿实参啊那是形参声明 
  5. 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);
    		
    	}
    }
    

      

  

posted @ 2020-01-08 10:51  Scorpicat  阅读(138)  评论(0编辑  收藏  举报