1.必须保证java运行环境是jdk1.8以上
2.在工程的build.gradle中添加依赖,这会使用retrolambda来编译Java代码
buildscript {
//开始加入
dependencies {
classpath 'me.tatarka:gradle-retrolambda:3.2.5'
}
//结束插入
}
3. 在app的build.gradle中应用插件声明:apply plugin:’me.tatarka.retrolambda’,在dependencies下加入以下引用
retrolambdaConfig 'net.orfjackal.retrolambda:retrolambda:2.3.0'
4. 加入compileOptions,这会让IDE使用用JAVA8语法解析,放在buildTypes里面
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
5.指定将源码编译的级别,,使用下列代码,会将代码编译到兼容1.6的字节码格式 放在app的build.gradle的放在buildTypes里面
retrolambda {
javaVersion JavaVersion.VERSION_1_6
}
6.使用
TextView点击事件
mText.setOnClickListener(v1-> Toast.makeText(MainActivity.this,"测试lambda表达式",Toast.LENGTH_LONG).show());
7.语法
lambda表达式的语法由参数列表、箭头符号->和函数体组成。函数体既可以是一个表达式,也可以是一个语句块:
表达式:表达式会被执行然后返回执行结果。
语句块:语句块中的语句会被依次执行,就像方法中的语句一样
使用Lambda语法,这个接口必须符合规范,它必须是“函数式接口”。什么是函数式接口?
一个函数式接口是一个能够使用类函数做为参数的类型,一个lambda表达式支持提供这样一个实参。
关键的是记住一条,Lambda表达式只适用于只有一个抽象方法的“函数式接口”。
看下面例子:
接口:
public interface Interface1 {
void show(String s,String s1);
}
public interface Interface2 {
void show(String s);
}
public interface Interface3 {
void show();
}
1. 完整表达式
Interface1 interface1 = (String s,String s1) ->{
Log.e("show1","你好吗");
Log.e("show1","我很好,谢谢");
};
当然这样写也可以
Interface1 interface1 = (s,s1) ->{
Log.e("show1","你好吗");
Log.e("show1","我很好,谢谢");
};
2. 只有一个参数 可以省略小括号
Interface2 interface2 = s ->{
Log.e("show2","你好吗");
Log.e("show2","我很好,谢谢");
};
3.空参数时括号不能省
Interface3 interface3 = ()-> Log.e("show3","你好吗");
词法作用域(lambda表达式基于词法作用域,也就是说lambda表达式函数体里面的变量和它外部环境的变量具有相同的语义)
//this代表的是外部的Activity对象
Runnable r1 = () -> Log.e(TAG, this+"");//com.choice.zlc.myapplication.MainActivity@c0ff504
r1.run();
//toString()是外部类Activity的toString,而不是Runnable的
Runnable r2 = () -> Log.e(TAG, toString());//com.choice.zlc.myapplication.MainActivity@c0ff504
r2.run();
8.目标类型和匹配
//可以用一个Lambda表达式为一个函数接口赋值
Runnable r1 = () -> {System.out.println("Hello Lambda!");};
//然后再赋值给一个Object
Object obj1 = r1;
//不能这样干 ERROR! Object is not a functional interface!
Object obj2 = () -> {System.out.println("Hello Lambda!");};
//必须显式的转型成一个函数接口才可以
Object obj3 = (Runnable) () -> { System.out.println("Hello Lambda!"); };
//Lambda表达式只有在转型成一个函数接口后才能被当做Object使用,所以下面这句也不能编译
System.out.println( () -> {} ); //错误! 目标类型不明确,println方法可以接受任何类型的参数,而() -> {}能匹配上很多函数接口
//必须先转型
System.out.println( (Runnable)() -> {} ); // 正确
9联系方式
qq : 1509815887
email : zlc921022@163.com