Lambda表达式

Lambda表达式本质上是一种匿名方法,它既没有方法名,也没有访问修饰符和返回值类型,使用它编写代码将会更加简洁,也更加容易读。
如果想要在Android项目中使用Lambda表达式或者Java8的其他新特性,首先我们需要在app/build.gradle添加如下配置
android {
    defaultConfig {
   ---------
        jackOptions.enabled = true
    }
    compileOptions{
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }

之后就可以开始使用Lambda表达式来编写代码了,比如说传统情况下开启一个子线程的写法如下:

new Thread(new Runnable()){
@Override
public void run(){
   //处理具体逻辑
}
}).start();

而使用Lambda表达式则可以这样写:

new Thread(()->{
//处理的具体逻辑
}).start();

是不是很神奇呢?不光是从代码的行数还是缩进结构上来看,Lambda表达式的写法明显要更加精简。
那么为什么可以使用这么神奇的写法呢?这是因为Thread类的构造函数接受的参数是一个Runnable接口,并且该接口中有一个待实现的方法.我们查看一下Runnable接口的源码,如下所示:

public
interface Runnable {
    /**
     * When an object implementing interface <code>Runnable</code> is used
     * to create a thread, starting the thread causes the object's
     * <code>run</code> method to be called in that separately executing
     * thread.
     * <p>
     * The general contract of the method <code>run</code> is that it may
     * take any action whatsoever.
     *
     * @see     java.lang.Thread#run()
     */
    public abstract void run();
}

凡是这种只有一个待实现方法的接口,都可以使用Lambda表达式的写法.比如说,通常创建一个类似于上述接口的匿名类实现需要这样写:

Runnable runnable = new Runnable(){
  @Override
  public void run(){
  //添加具体实现
  }
};

而有了Lamba表达式之后我们就可以这样写了:

Runnable runnable1 = ()->{
  //添加具体的实现
};

了解了Lambda表达式的基本写法,接下来我们尝试自定义一个接口,然后使用Lambda表达式的方式进行实现。
新建一个MyListener接口,代码如下所示:

public interface MyListener{
  String doSomething(String a,int b);
}

MyListener接口中也只有一个待实现方法,这和Runnable接口的结构是基本一致的。唯一不同的是,MyListener中的doSomething()方法是有参数并且是有返回值的,那么我们就来看一看这种情况下该如何使用Lambda表达式进行实现

MyListener listener = (String a,int b) -> {
   String result = a + b;
   return result;
};

可以看到,doSomething()方法的参数直接写在括号里面就可以了,而返回值仍然像往常一样,写在具体实现的最后一行即可。
另外,Java还可以根据上下文自动推断出lambda表达式中的参数类型,因此上面的代码也可以简化成如下写法

MyListenr listener = (a,b) ->{
String result = a + b;
return result;
}

Java将会自动推断出参数a是String类型,参数b是int类型,从而使我们的代码变得更加精简了。
接下来举个具体的例子,比如说现在有一个方法是接受MyListener参数的,如下所示:

 public void hello(MyListener listener){
   String a = "hello lambda";
   int b = 1024;
   String result = listener.doSomenting(a,b);
   Log.d("TAG",result);
 }

我们再调用hello()这个方法的时候就可以这样写:

hello((a,b) -> {
String result = a+b;
return result;
});

那么doSomething()方法就会将a和b两个参数进行相加,从而最终的打印结果就会是”Hello Lambda1024”;

原文地址:https://www.cnblogs.com/CCCrunner/p/11781847.html