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”;