Android中使用lambda表达式
lambda 语法简介
视频为本篇播客知识点讲解,建议采用超清模式观看, 欢迎点击订阅我的优酷
如果刚学Android,不知道怎么写点击事件可以跳转,传送门
要想在Android中使用lambda语法,首先我们需要了解下lambda语法是什么?
lambda语法是java8的新特性,能够大量减少匿名内部类那种冗余的代码。
我们先来看看老版的java代码,比如排列字符串:
List<String> names = Arrays.asList("peter", "anna", "mike", "xenia");
Collections.sort(names, new Comparator<String>() {
@Override
public int compare(String a, String b) {
return b.compareTo(a);
}
});
只需要给静态方法 Collections.sort 传入一个List对象以及一个比较器来按指定顺序排列。通常做法都是创建一个匿名的比较器对象然后将其传递给sort方法。
在Java 8 中你就没必要使用这种传统的匿名对象的方式了,Java 8提供了更简洁的语法,lambda表达式:
Collections.sort(names, (String a, String b) -> {
return b.compareTo(a);
});
看到了吧,代码变得更段且更具有可读性,但是实际上还可以写得更短,
对于函数体只有一行代码的,你可以去掉大括号{}以及return关键字:
Collections.sort(names, (String a, String b) -> b.compareTo(a));
起始你还可以挑战下lambada的极限,还可以写得更短点:
Collections.sort(names, (a, b) -> b.compareTo(a));
当然lambda语法还有好多新特性,
比如我们可以直接在lambda表达式中访问外层的局部变量:
public void method(){
String i="i";
button.setOnClickListener(v->{
Log.i("lambda",i); // 不报错
// i="a"; // 编译报错
});
}
和之前不同的是,这里的变量i可以不用声明为final,不过这里的i必须不可被后面的代码修改(即隐性的具有final的语义)
Android中使用lambda表达式
我们刚刚简单介绍了java8的新特性lambda,接下来我们就来看看怎么在Android中使用lambda。
由于lambda是java8新特性,所以请确保你的电脑里面有jdk8,然后记得Android Studio中配置jdk环境
注意,后面的才是重点, 因为google公司和oracle公司一直在打官司,所以Android默认是不支持java8的,如果你直接在代码中使用lambda语法,编译的时候就会提示“lambda expression are not supported at this language level”。
虽然不能直接使用,但是Android Studio这个工具相当棒,我们可以通过集成插件的形式使用,github地址
步骤1:
我们需要首先在项目根目录的build.gradle文件中添加依赖 “me.tatarka:gradle-retrolambda:3.2.0”
dependencies {
classpath 'com.android.tools.build:gradle:1.3.0'
classpath 'me.tatarka:gradle-retrolambda:3.2.0'
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
}
步骤2
在module目录下的build.gradle文件中应用插件
apply plugin: 'com.android.application'
apply plugin: 'me.tatarka.retrolambda'
步骤3
在module目录下build.gradle文件中的android节点下还需要表明使用jdk8,需要做如下配置:
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
配置完以后,预览下module目录下的build.gradle
apply plugin: 'com.android.application'
apply plugin: 'me.tatarka.retrolambda'
android {
compileSdkVersion 23
buildToolsVersion "23.0.1"
defaultConfig {
applicationId "com.demo.myapplication"
minSdkVersion 14
targetSdkVersion 22
versionCode 1
versionName "1.0"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
}
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
compile 'com.android.support:appcompat-v7:23.0.1'
}
经过上面3步,我们就可以在Android中使用lambda语法了,来看看效果:
当我们直接使用匿名内部类的时候,自动就提示我们lambda语法了。
Android中使用lambda表达式的更多相关文章
- Android中使用Lambda表达式开发
参考文章:ImportNew 要在Android开发中使用lambda表达式,首先需要在 Module 的build.gradle中加入: compileOptions { targetCompati ...
- 你知道C#中的Lambda表达式的演化过程吗
你知道C#中的Lambda表达式的演化过程吗? 阅读目录 委托的使用 匿名方法 Func和Action Lambda的诞生 那得从很久很久以前说起了,记得那个时候... 懵懂的记得从前有个叫委托的东西 ...
- C#中的Lambda表达式和表达式树
在C# 2.0中,通过方法组转换和匿名方法,使委托的实现得到了极大的简化.但是,匿名方法仍然有些臃肿,而且当代码中充满了匿名方法的时候,可读性可能就会受到影响.C# 3.0中出现的Lambda表达式在 ...
- C++11中的Lambda表达式
原文地址:C++中的Lambda表达式 作者:果冻想 一直都在提醒自己,我是搞C++的:但是当C++11出来这么长时间了,我却没有跟着队伍走,发现很对不起自己的身份,也还好,发现自己也有段时间没有写C ...
- Qt5中使用lambda表达式
c11新特性中加入了lambda表达式,所以Qt 也支持 需在.pro文件中加入 CONFIG += c++11 例子: QString program = "C:/Windows/Syst ...
- Lambda 表达式,Java中应用Lambda 表达式
一.Lambda 表达式 简单来说,编程中提到的 lambda 表达式,通常是在需要一个函数,但是又不想费神去命名一个函数的场合下使用,也就是指匿名函数. 链接:知乎 先举一个普通的 Python 例 ...
- 在Linq to sql 和 Entity framework 中使用lambda表达式实现left join
在Linq to sql 和 Entity framework 中使用lambda表达式实现left join 我们知道lambda表达式在Linq to sql 和 Entity framework ...
- Qt5中的lambda表达式和使用lambda来写connect
c11新特性中加入了lambda表达式,所以Qt 也支持 需在.pro文件中加入 CONFIG += c++11 例子: QString program = "C:/Windows/Syst ...
- 【转】你知道C#中的Lambda表达式的演化过程吗?
[转]你知道C#中的Lambda表达式的演化过程吗? 那得从很久很久以前说起了,记得那个时候... 懵懂的记得从前有个叫委托的东西是那么的高深难懂. 委托的使用 例一: 什么是委托? 个人理解:用来传 ...
随机推荐
- Django--多对多表的创建、contentType、ajax、ajax传输json数据格式、ajax传输文件数据、 自定义分页器
MTV与MVC(了解): MTV模型(Django用的就是MTV): M:模型层(models.py) T:templates C:views MVC模型: M:模型层(models.py) V:视图 ...
- Oracle中Function学习2
上一节说函数 这回聊一下 存储过程:有了上节知识点,对这个也许会一种小感觉.呵呵 过程(存储过程):与过程相比, 存储过程是存在数据库中的一个对象 我主要通过例子来了解 不做多解释 相信你也能明白: ...
- JS方法大全
方法:document.createElement(tagName) 说明:创建指定元素 方法:document.createTextNode(文本) 说明:创建文本节点 方法:_dom.append ...
- LintCode_14 二分查找
题目 给定一个排序的整数数组(升序)和一个要查找的整数target,用O(logn)的时间查找到target第一次出现的下标(从0开始),如果target不存在于数组中,返回-1. 样例 在数组 [1 ...
- NOIP模拟 7.04
魔术球问题弱化版(ball.c/.cpp/.pas) [题目描述] 假设有 n 根柱子,现要按下述规则在这 n 根柱子中依次放入编号为 1,2,3,…的球. (1)每次只能在某根柱子的最上面放球. ( ...
- Kubernetes 调度器实现初探
Kubernetes 调度器 Kubernetes 是一个基于容器的分布式调度器,实现了自己的调度模块.在Kubernetes集群中,调度器作为一个独立模块通过pod运行.从几个方面介绍Kuberne ...
- element-ui el-time-picker
获取时分秒时间 <el-time-picker is-range v-model="time" value-format="HH:mm:ss" range ...
- 【JZOJ4782】【NOIP2016提高A组模拟9.15】Math
题目描述 输入 输出 样例输入 3 5 样例输出 -1 数据范围 解法 观察式子,可以得知整个式子与d(i*j)的奇偶性有关. d(n)为奇数当且仅当n是完全平方数. 对于一个i,如果d(i*j) ( ...
- linux CentOs 7.4 64位 系统下 nuxt部署 、nginx 安装、node环境及软连接,pm2软连接
一.nginx安装 1.安装依赖包 //一键安装上面四个依赖 yum -y install gcc zlib zlib-devel pcre-devel openssl openssl-devel 2 ...
- 关于Apple Watch,听听开发了两个月Watch App的工程师怎么说
今年1月份有幸应苹果邀请,秘密参与苹果 Watch App 的真机现场调试.4月份,Apple Watch 会正式上市.在这之前,也算是亲自抢先体验了 Apple Watch,以及开发了一下 Watc ...