首页 > 代码库 > Lambda表达式

Lambda表达式

Lamdba表达式本质上是一种匿名方法,既没有方法名,也没有访问修饰符和返回值类型。
 
如果想要在Android项目中使用Lamdba表达式或者Java 8的其他新特性,首先我们需要在app/build.gradle中添加如下配置。
android {
    compileSdkVersion 25
    buildToolsVersion "25.0.3"
    defaultConfig {
        applicationId "co.example.leo.lambda"
        minSdkVersion 16
        targetSdkVersion 25
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
        jackOptions.enabled = true
    }
    compileOptions{
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile(proguard-android.txt), proguard-rules.pro
        }
    }
}

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

1 new Thread(new Runnable() {
2     @Override
3     public void run() {
4         //处理具体的逻辑 
5     }
6 }).start();

使用Lambda表达式可以这样写

1 new Thread(() ->{
2     //处理具体的逻辑
3 }).start();
为什么可以用这种写法呢? 是因为Thread类的构造函数接受的参数是一个Runnable接口,并且接口中只有一个待实现的方法。
凡事只有一个待实现方法的接口,都可以使用Lambda表达式的写法。
比如说,通常创建一个类似于上述接口的匿名类实现需要这样写:
1 Runnable runnable = new Runnable() {
2     @Override
3     public void run() {
4        
5      }
6 };
而通过Lambda表达式之后我们就可以这样写了
1 Runnable runnable = ()->{
2    
3  };

 

了解了Lambda表达式的基本写法,接下来我们尝试自定义一个接口,然后再使用Lambda表达式的方式进行实现

新建一个MyListener接口 代码如下所示

1 public interface MyListerner {
2 
3     String doSomething(String a, int b);
4 }
MyListener接口也只有一个待实现方法,这和Runnable接口的结构是基本一致的,唯一不同的是,MyListener中的doSomething()方法是有参数并且有返回值的
使用Lambda表达式创建MyListener接口的匿名实现方法如下。
1 MyListerner myListerner = (String a, int b) ->{
2     String result = a + b;
3     return result;
4 };

可以看到 doSomething()方法的参数直接写在括号里面就可以了,而返回值则仍然像往常一样。写在具体实现的最后一行即可。

Java中可以根据上下文自动推断出Lambda表达式中的参数类型,因此上面的代码也可以简化成如下写法。

1 MyListerner listerner = (a,b)->{、
2     String result = a +b;
3     return result;
4 };
Java将会自动推断出参数a是String类型,参数b是int类型。
 
 
只要是符合接口中只有一个待实现方法这个规则的功能,都是可以使用Lambda表达式来编写的。
类似设置点击事件之类的功能也是非常适合使用Lambda表达式的。
使用Lambda表达式之后,就可以将代码简化成这个样子。
1 Button button = (Button)findViewById(R.id.parent);
2 button.setOnClickListener((v)->{
3     //处理点击事件
4 });

当接口的待实现方法有且只有一个参数的时候,还可以进一步简化,将参数外面的括号去掉,如下所示。

1 Button button = (Button)findViewById(R.id.parent);
2 button.setOnClickListener(v->{
3     //处理点击事件
4 });

 

Lambda表达式