函数式接口
函数式接口是指接口中只有一个需要实现的方法。
例如Runnable接口:
public interface Runnable {
/**
* Starts executing the active part of the class' code. This method is
* called when a thread is started that has been created with a class which
* implements {@code Runnable}.
*/
public void run();
}
Lambda 表达式
基本格式: (形式参数) ->{方法体}
如果要创建上面的Runnable实例,我们以前的写法是:
Runnable r = new Runnable(){
public void run(){
System.out.println("线程开始");
}
}
使用Lambda写法:
Runnable r = () -> { System.out.println("线程开始"); }
从上面可以看出,可以使用 Lambda 表达式创建一个 Runnable 对象。
作用:对于一个函数式接口,使用Lambda表达式可创建该接口的对象。
问题来了,为什么使用Lambda格式也能创建一个对象呢?
因为Lambda作用的对象是函数式接口,而函数式接口中只定义了一个抽象方法,所以创建该对象只需实现该方法即可,要实现的方法也就可以唯一确定下来,我们只需传入该方法所需的参数以及实现,系统就能自动为我们创建该接口对象了。
形式参数格式
- 形式参数可已有0个或多个,使用圆括号包裹,如果有多个使用逗号隔开 (arg1 , arg2 , arg3 ...)
- 形式参数可以声明类型,也可不声明 。例如:(String arg1 , String arg2 ...) 等价于 (arg1 , arg2 ...)
- 如果只有一个参数,可省略 圆括号。例如:(arg1) ->{ } 等价于 arg1 ->{ }
方法体格式
- 方法体是包含在一对花括号里面
- 如果方法体只有一句,花括号可省略。例如 :
Runnable r = () -> { System.out.println("线程开始"); }
Runnable r = () -> System.out.println("线程开始");
- 如果该方法有返回值,在方法体需要返回对应的返回值。
自定义函数式接口
public interface MyInterface {
public void getId(int id); //该接口中只有一个需要实现的方法
}
//使用Lambda创建该接口的对象
MyInterface interface = (id) ->{ System.out.println("id:"+id) }
在Android Studio 中配置使用Lambda表达式
1. 搭建环境
版本:Android Studio 2.1 + jdk 1.8
查看当前使用的版本:点击 **Help -> About **
出现如下界面:
如需升级Android Studio,参考:http://www.jianshu.com/p/465b0234142b
2. 配置Gradle文件
如果环境搭建好,下面通过配置你app模块下的gradle文件:
android{
...
defaultConfig{
...
jackOptions{
enabled true
}
...
}
compileOptions{
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
...
}