一、参考文章
怒学Java8系列一:Lambda表达式
Android开发中使用lambda表达式
android lambda语法简述
二、Oracle官方介绍
- 简单说,就是Lambda提供了一个清晰和简洁的方式来表示一个方法的接口使用的表达式。
三、AS配置使用环境
3.1 Android Studio 2.1.1之前,需要自己导入插件
-
3.1.1 在 Project 的 build.gradle 中添加如下代码
dependencies { classpath 'me.tatarka:gradle-retrolambda:3.2.0' }
-
3.1.2 在 Module 的 build.gradle 中添加如下代码
// 应用插件 apply plugin: 'me.tatarka.retrolambda' // 支持Java8 android { compileOptions { sourceCompatibility JavaVersion.VERSION_1_8 targetCompatibility JavaVersion.VERSION_1_8 } }
配置完,编译一下就大功告成
3.2 Android Studio 2.1.1之后(支持lambda插件)
-
先将SDK更新到最新,然后在 Module 的 build.gradle 文件中添加如下代码
android { defaultConfig { jackOptions { // 打开jack编译器 enabled true } } // 编译支持Java8 compileOptions { sourceCompatibility JavaVersion.VERSION_1_8 targetCompatibility JavaVersion.VERSION_1_8 } }
四、Lambda表达式的使用
在AS中,如果配置了lambda的插件,可以用lambda的地方就会自动变灰色,然后用lambda替换就好了。
语法
语法一:()->{}
其中()和{}可以看情况去掉,()只有一个参数可去掉,{}里逻辑只有一行可去掉
-
无参数时,直接这么写
// 创建Runnable对象 Runnable runnable = () -> { };
-
有一个参数时,直接 参数名 -> {}
View.OnClickListener listener = view -> { };
-
有多个参数时,只需要在()里写上参数名字就可以
View.OnFocusChangeListener listener = (view, b) -> { };
语法二:::(两个英文冒号)
::是对语法一的简化。
-
如下代码,可以实现语法一一样的效果
static class LambdaTest{ public static void getData(String args1,boolean args2,int args3){ System.out.println("获取数据了"); } } interface RequestTask { void requestData(String args1,boolean args2,int args3); } public static void main(String args[]){ RequestTask task1 = (args1, args2, args3) -> LambdaTest.getData(args1,args2,args3); RequestTask task2 = LambdaTest::getData; }
-
:: 语法有一下几种使用情况
- 静态方法引用:ClassName::staticMethodName
- 实例上的实例方法引用:instanceReference::methodName
- 构造方法引用:ClassName::new