‘壹’ 如何在android mole中使用java 8的新特性,比如Lambda
在Java8之前,Java并不支持Lambda表达式,而Android目前最新也才支持到Java7特性,所以在Android中使用Lambda表达式需要进行一些处理,将Lambda表达式编译成Android可以“理解”的方式。 Retrolambda是一个能够让我们在Java7中使用Lambda的工具,再通过gradle-retrolambda插件,在gradle编译过程中将会: 将Java8中的 javac编译 Java8的代码; 将产生的Java8的字节码转换为Java6的字节码; 重新打包class。 build.gradle配置文件如下: buildscript { repositories { mavenCentral() maven { url "https://oss.sonatype.org/content/repositories/snapshots" } } dependencies { classpath 'me.tatarka:gradle-retrolambda:1.2.+' }
‘贰’ 如何评价Android N 里“改进的 Java 8 支持”
“改进的 Java 8 支持:我们非常兴奋地将 Java 8 语言特性带到 Android 上。使用 Android 的 Jack 编译器,现在你可以使用许多流行的 Java 8 语言特性,包括 lambda 等,并且向前可以支持到 Android Gingerbread 上使用。新的特性帮助减少样板代码。例如,在需要提供事件监听器的地方可以使用 lambda 代替匿名内部类。一些 Java 8 语言特性,如默认方法和静态方法、stream、函数式接口,现在都可以在 Android N 及以上版本中使用。使用 Jack 编译器,我们期望在保持向前兼容的同时更紧地跟上 Java 语言。”
‘叁’ Android什么时候支持Java8
Android API 21才支持Java7,就算之后的版本可以支持了Java8,你也得使用旧版本Java API开发,Android版本分裂就是这么恶心,要等用户手头上设备都升级到5.0,估计得是几年后的事了
‘肆’ 如何在 Android 中使用 Java8
目前只能使用Android的部分特性。例如lambda表达式
在mole的build.gradle文件里面添加如下代码
applyplugin:'me.tatarka.retrolambda'
在android节点添加如下代码
compileOptions{
.VERSION_1_8
.VERSION_1_8
}
就能使用lambda表达式了
‘伍’ 如何在Android Studio中使用java 8
、下载Java8的jdk进行安装
2、然后在Andstudio中打开Project Structure 设置一下JDK的路径,如下图:
3、在项目中bulid.gradle中 将jdk版本更改为JavaVersion.VERSION_1_8
如下图:
4、到这时候呢 已经可以在项目中书写 Lambda语法 而不会报错了,但是 当我们编译的时候还是会报 class file for java.lang.invoke.MethodType not found #23 这个错,
这时候我们只要在工程的bulid.gradle中的buildscript里去配置下:classpath 'me.tatarka:gradle-retrolambda:3.2.4' 如图:
5、最后在app的bulid.gradle中加上 apply plugin: 'me.tatarka.retrolambda' 就OK了,如图:
‘陆’ Android什么时候支持Java8
JDK是 Java 语言的软件开发工具包,主要用于移动设备、嵌入式设备上的java应用程序。JDK是整个java开发的核心,它包含了JAVA的运行环境,JAVA工具和JAVA基础的类库。
2014-03-18发布jdk1.8 其新特性:
Java 8允许我们给接口添加一个非抽象的方法实现,只需要使用 default关键字即可。
新增lambda表达式
提供函数式接口
Java 8 允许你使用 :: 关键字来传递方法或者构造函数引用
我们可以直接在lambda表达式中访问外层的局部变量。
Android目前新版本6支持的jdk是 java 7
‘柒’ 如何在Android Studio中使用java 8
如果你首先是一个Java开发人员,你可能认为Android将完全支持当前版本的Java是公理的。你会错了。部分原因是由于Oracle的诉讼,部分原因是它不是他们的首要任务,Android在采用当前的Java SE版本时速度很慢。使用Android Nougat(7.0),Android团队已开始转向Java(Java 8)的当前版本,但部分和增量。好消息是,Android库的许多Java兼容部分显然是基于来自OpenJDK 8的源代码,因此令人讨厌的小不一致的数量应该随着时间的推移而减少。注意,为了编译Android
Nougat,您必须安装Java 8 SDK,即使您没有使用任何这些功能!
“Jack”(Java编译工具包?)是一个新的工具链,它将Java代码编译成自己的格式 - 没有更多的类文件到Dex翻译。这应该更快,但也意味着工具像findbugs读取.class文件将不再工作,没有额外的编译步骤。
要使用Jack,您必须具有Android Studio 2.1或更高版本以及Build Tools软件包24或更高版本。并且必须在build.gradle或模块设置中将Source和Target编译级别设置为1.8。另外,从当前预览,您必须手动添加jackOptions使能条目到build.gradle,在defaultConfig条目内:
android {
defaultConfig {
// Other defaults here...
// Enable 'jack'
jackOptions {
enabled true
}
}
// And if you prefer to set these manually:
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
}
‘捌’ 如何在android mole中使用Java 8的新特性,比如Lambda
概述
lambda和Stream表达式是java8引入的新特性,要理解lambda表达式,其中最重要的概念就是函数式接口(functional interface),而在Android中有很多这种接口,如点击事件OnclickListener等。简单来说,函数式接口是只包含一个抽象方法的接口。比如Java标准库中的java.lang.Runnable和java.util.Comparator都是典型的函数式接口。
来看一下lanbda语法,以java.util.Comparator接口为例
使用Rxjava的朋友,肯定对这种语法很熟悉。lanbda更多特性参照
Java 8 Tutorial
retrolambda
在android 中磨人是不支持java8的,那么该如何使用呢,在android中我们必须借助一个插件retrolambda@[Github],该插件将Java8中的lambda表达式特性兼容到java 5。
引入步骤
download and install java8
在project的build.gradle中加入
classpath 'me.tatarka:gradle-retrolambda:3.2.0'11
完整代码:
buildscript {
repositories {
jcenter()
}
dependencies {
classpath 'com.android.tools.build:gradle:1.2.3'
classpath 'me.tatarka:gradle-retrolambda:3.2.0'
}
}
allprojects {
repositories {
jcenter()
}
}
在mole的build.gradle中使用插件
apply plugin: 'me.tatarka.retrolambda'11
在android节点下加入环境支持
android{
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
}123456123456
完整代码:
apply plugin: 'com.android.application'
apply plugin: 'me.tatarka.retrolambda'
android {
compileSdkVersion 22
buildToolsVersion "22.0.1"
defaultConfig {
applicationId "com.bobomee.android.lambda.sample"
minSdkVersion 15
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:22.2.0'
}
Stream
同时Stream API让我们对于集合的操作也变得十分的简洁
Stream.of(/* array | list | set | map | anything based on Iterator/Iterable interface */)
.filter(..)
.map(..)
...
.sorted()
.forEach(..);
Stream.of(value1, value2, value3)...
Stream.ofRange(0, 10)...1234567812345678
具体可参考:Lightweight-Stream-API@[Github]
Java 8 Stream on Android
测试
imageView.post(()-> Toast.makeText(this,"lambda-test",Toast.LENGTH_LONG).show()); 11
这里模拟了Runnable接口,如果打出toast,则说明引入成功了,否则clean或者同步一下工程即可。