Android Studio中如何支持使用Lambda表达式
Java8引入了lambda表达式,Lambda 表达式”(lambda expression)是一个匿名函数,本质上就是可以传递给其他函数的一小段代码。
下面来看一下如何让自己的项目支持使用lambda表达式,以达到简化代码的目的。
先来举个栗子,看看我们平常写点击事件是如何写的
普通写法:
tv.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { //处理逻辑 } });
Lambda表达式写法
tv.setOnClickListener(v->Toast.makeText(this,"this is lambda",Toast.LENGTH_SHORT).show());
是不是代码变得简洁了很多。
下面就介绍一下使用Android studio 3.0.1新建项目,配置支持Lambda表达式。
gradle android插件版本为:classpath 'com.android.tools.build:gradle:3.0.1'
可能有以下三种情形:
(1)集成了Kotlin环境,但项目是混合开发的,.java和.kt的代码都有。
此时,在.kt的代码中可以直接使用lambda表达式,而在java代码中,如果直接使用的话,会报如下提示
Lambda expressions are not supported at this language level
此时,我们只需要在app的build.gradle中的android{ }内添加如下配置即可。
compileOptions { targetCompatibility 1.8 sourceCompatibility 1.8 }
(2)纯Kotlin开发环境,只在Kotlin代码中使用lambda表达式
Kotlin标准库大量的使用了lambda表达式,所以在Kotlin代码中可以直接使用。只要有Kotlin环境的基本配置即可。
button.setOnClickListener { v -> Toast.makeText(applicationContext,"this is lambda",Toast.LENGTH_SHORT).show() }
(3)纯Java代码开发环境,没有引入Kotlin支持库。
也只需要在app的build.gradle中的android{ }内添加如下配置即可。
compileOptions { targetCompatibility 1.8 sourceCompatibility 1.8 }
综上,正常情况下,其实要支持lambda,只要添加上面compileOptions 的配置就行了。
配置到我自己的项目
我也是在app.build中添加:
compileOptions { targetCompatibility 1.8 sourceCompatibility 1.8 }
很简单吧,但是当我配置到我自己项目的时候,居然!!!出错了.......竟然如此尴尬......
(我项目的gradle插件版本是: classpath 'com.android.tools.build:gradle:2.2.2' ,项目配置了Kotlin环境,Kotlin版本是: ext.kotlin_version = '1.2.10' 的)
编译报错:Error:Jack is required to support java 8 language features. Either enable Jack or remove sourceCompatibility JavaVersion.VERSION_1_8.
于是我搜索了一下 解决办法,说是在app.build中加入jackOptions 中就行了。
defaultConfig { jackOptions { enabled true } }
同步了一下,结果.....并没有成功!报下面的错误:
Kotlin Gradle plugin does not support the deprecated Jack toolchain.Disable Jack or revert to Kotlin Gradle plugin version 1.1.1.
遇到这种工程构建的错误,确实是挺烦人的,但是大家一定要有耐心,仔细查错,不要着急。
按照上面提示:Kotlin版本不支持配置jackOptions ,要我把版本Kotlin改成1.1.1。OK,那就把Kotlin版本改成1.1.1咯,同步一下,OK。但是发现这样的方式,导致项目构建很慢,于是乎又找了另外一种方法配置。
简单一步到位的配置支持Lambda
针对我的项目从头开始,手动去添加支持lambda的插件,也是OK的,这样一步到位,不会出错,完整的配置为:
工程的build.gradle中添加
dependencies { classpath 'com.android.tools.build:gradle:2.2.2' //classpath 'com.neenbedankt.gradle.plugins:android-apt:1.8' //java中支持lambda classpath 'me.tatarka:gradle-retrolambda:3.2.5' }
app.gradle中添加
//apply plugin: 'android-apt' //java中支持lambda apply plugin: 'me.tatarka.retrolambda' android{ compileOptions { targetCompatibility 1.8 sourceCompatibility 1.8 } }
搞定!!!(android-apt插件可配可不配都行)
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
Java小白进阶笔记(3)-初级面向对象
继续学习:4.偏头痛杨的Java入门教学系列之初级面向对象篇 分割线中为原文的摘录: 面向过程编程&面向对象编程 从面向过程到面向对象,不仅仅是编程方式的改变,更重要的是思维方式的改变。 面向过程编程 按照顺序执行的一系列指令,通常是分析出解决问题所需要的步骤,然后用函数把这些步骤一步一步实现,最后一个一个依次调用函数来解决。 面向对象编程 从不同的角度来看待计算机程序,它注重的是计算机所完成的任务,而非处理方式。从现实世界中客观存在的事物出发来构造软件系统,并在系统构造中尽可能运用人类的自然思维方式来思考问题,把问题中的事物分解为为系统中的对象,给对象赋予相应的属性和行为,通过多个对象的相互协调来解决问题,对象是系统的基本构成单位。 传统的C语言属于面向过程编程,Java语言属于面向对象编程。 ATM取款机程序的例子 面向过程编程: 输入密码,系统判断是否正确,如正确,进入取款界面,如错误,提示重新输入。 进入取款界面,输入取款金额,系统判断余额是否足够,如不足,提示;如足够,点钞。 吐出钞票,打印票据。 面向对象编程:根据要解决的问题,可以抽象出如下对象:客户、银行卡、现金...
- 下一篇
php中一些提高性能的技巧
php中一些提高性能的技巧 tags:php性能 提高性能 php中的@ php的静态 引言:php作为一种脚本语言,本身的性能上肯定是不如c++或者java的。拥有简单易学的特性的同时,性能提升的空间也并不是没有。养成一些好的编程习惯,也许可以让你的php代码性能得到可见的提升。 一、消除不必要的错误提示 有很多朋友编程的时候遇到notice和warning这类的错误,如果不影响正常的逻辑就不去处理了,类似下面这种 <?php //想在循环中拼接字符串,却不初始化字符串直接使用 .= $list = array( 1=>'hello', 2=>'world' //... ); foreach($list as $key=>$val){ $str .= $val; } // Notice: Undefined variable: str in D:\11\index.php /*********************************************************/ //不注意的数组下标越界或key不存在 $List_1 = array...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- Windows10,CentOS7,CentOS8安装MongoDB4.0.16
- CentOS8,CentOS7,CentOS6编译安装Redis5.0.7
- CentOS8安装Docker,最新的服务器搭配容器使用
- MySQL8.0.19开启GTID主从同步CentOS8
- SpringBoot2全家桶,快速入门学习开发网站教程
- Docker快速安装Oracle11G,搭建oracle11g学习环境
- SpringBoot2更换Tomcat为Jetty,小型站点的福音
- Docker安装Oracle12C,快速搭建Oracle学习环境
- CentOS7编译安装Cmake3.16.3,解决mysql等软件编译问题