一.studio中引入Lambda
依次点击File->Other Settings->Default Project Structure
JDK location确保当前项目实用的JDK版本是1.8
打开项目(Project)的build.gradle,在dependencies节点添加
classpath 'me.tatarka:gradle-retrolambda:3.2.5'
打开项目(Module)的build.gradle在根节点添加
apply plugin: 'me.tatarka.retrolambda'
在android接点添加
compileOptions { sourceCompatibility JavaVersion.VERSION_1_8 targetCompatibility JavaVersion.VERSION_1_8 }
二.使用lambda表达式的三种写法
当我们在Android开发中,去写一个线程或者button的点击事件时,写完之后使用代码折叠功能,可以看到如下预览
这个其实就是Lambda表达式的写法,对于我们开发来说,不会去关心这个类以及方法
只会关心这个方法内的代码,所以其他的多余代码就显得多余了。
1.第一种方式,无参数+语句(代码块):使用于匿名内部类中方法无参数的情况
public void testNombal(){ //传统写法 myHandler.postDelayed(new Runnable() { @Override public void run() { Log.e("TAG","lambda"); } },1000); } //Lambda表达式写法 public void testLambda(){ myHandler.postDelayed(() -> Log.e("TAG","lambda"),1000); }
2.第二种方式,有参数+语句:适用于内部类中方法只有一个参数的情况
/** * 第二种方式,有参数+语句:使用于匿名内部类方法只有一个参数的情况 * 方法参数 -> 语句 * 活 * 方法参数 ->代码块 */ /** * 传统写法 */ findViewById(R.id.button3).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Log.e("TAG","test"); } }); /** * 使用lambda表达式 */ findViewById(R.id.button3).setOnClickListener(v-> Log.e("TAG","test"));
3.第三种方式,有参数+代码块:适用于匿名内部类中方法不只一个参数的情况
/** * 第三种方式,有参数+代码块:适用于匿名内部类中方法不止一个参数的情况 * (参数1,参数2) -> 语句 * 或 * (参数1,参数2)-> {代码块} */ CheckBox checkBox = findViewById(R.id.checkbox); checkBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { @Override public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { Log.e("TAG","test"); } }); checkBox.setOnCheckedChangeListener((buttonView,isChecked) -> { Log.e("TAG","test"); Log.e("TAG","test"+isChecked); });