1,介绍
【1】lambda是什么?
-
简单的说就是一个表达式,用来优化匿名对象。
-
"Lambda 表达式"(lambda expression)是一个匿名函数,Lambda表达式基于数学中的λ演算得名,直接对应于其中的lambda抽象(lambda abstraction),是一个匿名函数,即没有函数名的函数 所以试着使用匿名函数的方式来理解
(params) -> expressio//函数名呢?没有!!!
(params) -> statemen//函数名呢?没有!!!
(params) -> { statements } //函数名呢?没有!!!》》
【2】语法是什么?
-
包含三个部分 一个括号内用逗号分隔的形式参数,参数是函数式接口里面方法的参数 一个箭头符号:->方法体,可以是表达式和代码块,方法体函数式接口里面方法的实现,如果是代码块,则必须用{}来包裹起来,且需要一个return 返回值,但有个例外,若函数式接口里面方法返回值是void,则无需{}
(parameters) -> expression
(parameters) -> { statements; }
-
Lambda表达式是在JDK 8中开始支持的一种函数式推导语言,能够大量减少匿名内部类那种冗余的代码。在Android中,可以大量步回调等场景。Lambda表达式 vs 匿名类既然lambda表达式即将正式取代Java代码中的匿名内部类,那么有必要对二者做一个比较分析。
-
不同点一:关键字 this。匿名类的 lambda表达式的 this 关键字指向包围lambda表达式的类。
-
不同点二:编译方式。Java编译器将lambda表达式编译成类的私有方法。
扫描二维码关注公众号,回复: 6097973 查看本文章
2,Android studio 关联Lambda
【1】Github地址:https://github.com/evant/gradle-retrolambda
【2】导入步骤
-
在项目的build.gradle 文件中添加仓库,添加路径
buildscript {
repositories {
jcenter()
mavenCentral()
}
dependencies {
classpath 'com.android.tools.build:gradle:2.2.2'
classpath 'me.tatarka:gradle-retrolambda:3.3.1'
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
}
}
allprojects {
repositories {
jcenter()
mavenCentral()
}
}
-
在app/build.gradle 中配置
apply plugin: 'me.tatarka.retrolambda'
android {
compileSdkVersion 25
buildToolsVersion "25.0.0"
defaultConfig {
}
buildTypes {
}
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
}
dependencies {
}
3,Lambda 表达式
【1】匿名内部类
-
java正常语法
Button.setOnClickListener(new MyListener() {
@Override
public void onClick(View v) {
System.out.println("ss");
}
});
-
Lambda 表达:使用Lambda表达式替换匿名对象,匿名对象的接口只能有一个抽象方法
myButton.setOnClickListener((View v)->System.out.println("ss"));
-
如果只有一个参数可以直接去掉变量名,如果有两句输出语句必须添加{}
myButton.setOnClickListener(v->System.out.println("ss"));
【2】无参数,无返回值的lambda表达式
-
创建一个类,实现onClick 接口方法,使用Lambda表达式替换匿名对象,匿名对象的接口只能有一个抽象方法
class MyButton {
public void setOnClickListener(MyListener listener){}
}
interface MyListener{
void onClick();
}
-
调用Java实现
MyButton myButton = new MyButton();
myButton.setOnClickListener(new MyListener() {
@Override
public void onClick() {
System.out.println("ss");
}
});
-
Lambad 无参数表达。(无参数,无返回值,lambda 必须写小括号)
myButton.setOnClickListener(()->System.out.println("ss"));*/
【3】有参数,无返回值的lambda表达式
-
接口方法中有一个参数,
class MyButton {
public void setOnClickListener(MyListener listener){
}
}
interface MyListener{
void onClick(String s);
}
-
调用Java实现
MyButton myButton = new MyButton();
myButton.setOnClickListener(new MyListener() {
@Override
public void onClick(String s) {
System.out.println("ss");
}
});
-
Lambad有一个参数表达:如果只有一个参数,可以不要小括号
// 如果只有一个参数,可以不要小括号
myButton.setOnClickListener(s->System.out.println("ss"));*/
【4】有参数,有返回类型的lambda表达式
-
接口方法中有一个参数,有返回值
class MyButton {
public void setOnClickListener(MyListener listener){
}
}
interface MyListener{
boolean onClick(String s);
}
}
-
java 调用
/*MyButton myButton = new MyButton();
myButton.setOnClickListener(new MyListener() {
@Override
public boolean onClick(String s) {
return false;
}
});
-
带返回值,如果只有一个返回结果,不需要写return
myButton.setOnClickListener(s->true);
【4】有2个参数,有返回类型的lambda表达式
-
接口方法中有2个参数,有返回值
class MyButton {
public void setOnClickListener(MyListener listener){
}
}
interface MyListener{
boolean onClick(String s,int i);
}
-
java调用
MyButton myButton = new MyButton();
myButton.setOnClickListener(new MyListener() {
@Override
public boolean onClick(String s, int i) {
return false;
}
});
-
2个参数,有返回结果,还有两个语句
// 两个以上参数,不能删除小括号
myButton.setOnClickListener((String s, int i)-> {System.out.println("ss"); return false});