Lambda表达式
Posted mystic
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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表达式的主要内容,如果未能解决你的问题,请参考以下文章