前言
java语言自从走入SE8版本就异常的让开发者感到兴奋,随之而来的rxjava系列等(类似于javaScript的Promise A+)的functional programing瞬间风起云涌,另不少java开发者眼前一亮 并且看到了java的闪亮的未来
但是,作为android平台的一名App开发者,如果我们想在android App开发过程中使用java8的新特性那可能就另当别论了,因此今天这篇随笔就来讨论讨论“如何在android应用开发中使用java8新特性”
android和java
当我们一开始接触android应用开发的那刻起,我们就被告知使用java语言来编写android程序,我们要安装java环境,在IDE中使用java的API去编写代码逻辑。我们使用java 6/7中java EE代码中常见的几乎所有语法和代码;我们很少发现当把一些java EE项目的java代码原封不动移植到android应用中会出现什么问题,并且我们很少被告知android sdk的API实质上只是标准java SE API的一个子集;另外,很少有人学习完用如何用Activity、Fragment等控件结合简单的java代码写出一个可以在手机上运行后紧接着去继续学习,去继续学习android frameWork以及native层与Linux底层的实现。
在这里我不想大谈特谈android的实现机制和原理,只想抛砖引玉的提醒一下:
android !=java
为何需要使用java8的新特性
如果你能了解下“函数式编程(functional programing)”以及“响应式编程(reactive programing)”的魅力的话,那么你就会慢慢喜欢上他,简洁、高效的风格,如果从前你的业务逻辑代码是“面向数据抽象”的那么有了他们那就是“面向行为抽象”了
来点栗子吧,比如下面这段代码
int count = 0;for(Artist artist:allArtists){if(artist.isFrom("London")){
count++;
}
}
或者使用Iterator
其实完全可以写成这样:
long count =allArtists.stream()
.filter(artist->artist.isFrom("London"))
.count();
一目了然。。。
具体java8中lambda表达式以及集合类中的stream的进阶知识不在这里讲解了,今天的目的是介绍在android开发当中如何使用java8特性
如何做
现在的android sdk已经可以正常使用java7之前所有语言特性了,但java8仍然只能在个别sdk level上使用,如链接里面android developer文档中所述,使用jack可以让android使用部分java8的特性,而且仍然受困于sdk的版本支持;
那么如何做?才可以尽情的使用java8的语言特性在android中任何sdk版本中畅游呢?
gradle-retrolambda
https://github.com/evant/gradle-retrolambda,在android studio的构建工具gradle中使用该plugin,便可以做到在任何sdk版本种使用java 8语言新特性了。
当然,如果你仔细思考下它实现的原理不难发现,其实他跟jack类似工作在.class文件跟.dex文件这个阶段,它实质上是吧你编写的java8代码转化为java6/7的代码了而已,但即便如此,java8语言特性所带来的业务逻辑代码“可读性、可维护性”仍然是非常具有价值的