Lambda表达式是JDK1.8的新特性,使用Lambda表达式可以极大的简化匿名内部类的书写,Lambda表达式最低可以兼容Android2.3系统,做过Android开发的人都知道,匿名内部类的使用太平常和频繁不过了,随随便便添加一个监听事件就会用到,开启个子线程也会用到,自定义一个回调接口也会用到.那么如果使用Lambda表达式将会带来哪些书写方面的简便呢?
它可以让你的匿名函数省去书写new关键字、匿名函数的类名、方法名、方法的权限修饰符、return关键字、甚至是参数的类型。仅仅是使用如下的表达式即可,有点类似ES6的匿名函数的使用.
//空参数不带返回值函数调用
()->{}
//空参数带返回值函数调用,返回值直接写在花括号内,函数体只有一条语句,{}也可以省略
()->{...}
//单参数函数调用,参数类型不用声明,单个参数可以省略()
v->{...}
//多参数函数调用,参数类型需要声明,括号不能省略
(String str,int a)->{...}
在Android Studio中使用Lambda表达式需要配置下app目录下的build.gradle文件:
android {
...
defaultConfig {
...
jackOptions.enabled = true
}
compileOptions {
sourceCompatibility org.gradle.api.JavaVersion.VERSION_1_8
targetCompatibility org.gradle.api.JavaVersion.VERSION_1_8
}
...
}
下面分别举例演示下Lambda的使用语法,使用Lambda表达式有个前提条件,被简化书写的匿名内部类的父类或者其所实现的接口中只能有一个方法.
设置点击事件监听
//非Lambda表达式写法
findViewById(R.id.btn_click).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(MainActivity.this, "normal regist onClick", Toast.LENGTH_SHORT).show();
}
});
//Lambda表达式写法
findViewById(R.id.btn_click1).setOnClickListener(v ->
Toast.makeText(MainActivity.this, "Use Lambda to show view onClick",Toast.LENGTH_SHORT).show()
);
创建子线程
new Thread(()->{
//...doSomething
}).start();
调用空参数方法
//接口
public interface EmptyParamLambda {
String print();
}
/**
* 调用空参数方法
* @param lambda
*/
private void CallEmptyParamLambda(EmptyParamLambda lambda) {
String result = lambda.print();
Toast.makeText(MainActivity.this, result , Toast.LENGTH_SHORT).show();
}
//使用方式
findViewById(R.id.btn_click2).setOnClickListener(v->{
CallEmptyParamLambda(()-> "empty method called");
});
调用多参数方法
//接口
public interface ParamsLambda {
String print(String a,int b);
}
/**
* 调用多参数方法
* @param lambda
*/
private void CallParamsLambda(ParamsLambda lambda) {
String result = lambda.print("hello lambda", 123);
Toast.makeText(MainActivity.this, result, Toast.LENGTH_SHORT).show();
}
//使用方式
findViewById(R.id.btn_click3).setOnClickListener(v->{
CallParamsLambda((String a,int b)-> "params method called result is:"+a+b);
});
调用单参数方法
//接口
public interface SingleParamLambda {
void print(String str);
}
/**
* 调用单参数方法
* @param lambda
*/
private void CallSingleParamsLambda(SingleParamLambda lambda) {
lambda.print("hello lambda");
}
//使用方式
findViewById(R.id.btn_click4).setOnClickListener(v -> {
CallSingleParamsLambda(value->{
Toast.makeText(MainActivity.this, value, Toast.LENGTH_SHORT).show();
});
});