Lambda表达式本质是一种匿名方法,它既没有方法名,也没有访问修饰符和返回值类型,用它来写代码更简洁,更易懂。
Lambda是Java8的新特性,所以要在
app/build.gardle
中添加:
android {
......
compileOptions{
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
}
之后就可以使用Lambda表达式了,像下面这样两种方法相同:
new Thread(new Runnable() {
@Override
public void run() {
// 具体逻辑
}
}).start();
new Thread(() -> {
// 具体逻辑
}).start();
为啥可以有这么精简的写法呢?这是因为
Thread
类的构造函数接收的参数是一个Runnable
接口,并且该接口中只有一个待实现的方法:
@FunctionalInterface
public interface Runnable {
public abstract void run();
}
像是这种只有一个待实现方法的接口,都可用
Lambda
表达式的写法。了解了这种基本写法骂我们接着尝试自定义一个接口。然后用
Lambda
表达式的方式实现,新建一个MyListener
接口,代码如下所示:
public interface MyListener{
String doSomething(String a, int b);
}
那么就可以这么实现它:
MyListener listener = (String a, int b) -> {
String result = a + b;
return result;
};
而且
Java
能自动推断出Lambda
表达式的参数类型,所以还能这么写:
MyListener listener = (a, b) -> {
return a + b;
}
再举个具体的例子,比方说现在有一个方法是接收MyListener参数:
public void hello(MyListener listener){
String a = "Hello Lamba";
int b = 1024;
String result = listener.dosomething(a, b);
Log.d(TAG, result);
}
在调用
hello()
就能这么写:
hello((a, b) -> {
String result = a + b;
return result;
});
那么在Android中哪些方法能替换呢?
按钮点击事件
原来:
Button button = findViewById(R.id.button);
button.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View v){
// 处理点击事件
}
));
Lambda
简化:
Button button = findViewById(R.id.button);
button.setOnClickListener(v -> {
// 处理点击事件
});
搞定!
作者:有意识的呼吸