Java 8 推出已经将近 2 年多了,引入很多革命性变化,加入了函数式编程的特征,使基于行为的编程成为可能,同时减化了各种设计模式的实现方式,是 Java 有史以来最重要的更新。但是 Android 上,一直没有看到支持 Java8 的消息。Android 到底会不会支持 Java8 呢?答案是肯定的,Android N 已经开始支持 Java 8 了。
Java 8 的一大亮点是引入 Lambda 表达式,使用它设计的代码会更加简洁。当开发者在编写 Lambda 表达式时,也会随之被编译成一个函数式接口。
Java 8 引入的一个核心概念是函数式接口。如果一个接口定义个唯一一个抽象方法,那么这个接口就成为函数式接口。
这是一个以前不能做到的,对编译器判定泛型能力的努力改进。在以前版本的 Java 中有许多情形编译器不能给某个方法计算出泛型,当方法处于嵌套的或串联方法调用这样的上下文的时候,即使有时候对程序员来说它看起来 "很明显"。
集合(Collections)的改进也是 Java 8 的一大亮点,而让集合越来越好的核心组件则是 "Stream"。它与 java.io 包里的 InputStream 和 OutputStream 是完全不同的概念,它是一个全新的概念,大家不要混淆。此外,Stream 的出现也并不是要取代 ArrayLists 或其他集合,它提供了一种操作大数据接口,让数据操作更容易和更快。
解说:不过上面的几大改变仅仅只能在 Android N 及之后的版本才能使用,这也让 Android 23 及以下还在使用 Java 7 开发的小伙伴们望尘莫及,不过 Java 8 的 lambda 表达式还是可以支持的,接下来我们看下如何使用 Java 8.
- android {...defaultConfig {...jackOptions {
- enabled true
- }
- }
- compileOptions {
- sourceCompatibility JavaVersion.VERSION_1_8 targetCompatibility JavaVersion.VERSION_1_8
- }
- }
我这里使用的 Android studio 2.2.2 版本 Android 版本为 24,如果是低于 24 版本的话是无法使用 Java 8 特性的。如果仅仅只想使用 lambda 表达式的话完全够用了,我们只需把 minSdkVersion 设为 14 即可。
以下是我自己的设置范例
- android {
- compileSdkVersion 24 buildToolsVersion '24.0.2'defaultConfig {
- applicationId "com.whoislcj.jsbridge"minSdkVersion 14 targetSdkVersion 24 versionCode 1 versionName "1.0"jackOptions {
- enabled true
- }
- }
- buildTypes {
- release {
- minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android.txt'),
- 'proguard-rules.pro'
- }
- }
- dexOptions {
- incremental true
- }
- compileOptions {
- sourceCompatibility JavaVersion.VERSION_1_8 targetCompatibility JavaVersion.VERSION_1_8
- }
- productFlavors {}
- }
"Lambda 表达式"(lambda expression) 是一个匿名函数,Lambda 表达式基于数学中的λ演算得名,直接对应于其中的 lambda 抽象 (lambda abstraction),是一个匿名函数,即没有函数名的函数。Lambda 表达式可以表示闭包(注意和数学传统意义上的不同)。
这里以常见的 Java 匿名内部类为例
(1.)未使用 lambda 表达式之前
- 1 findViewById(R.id.to_web).setOnClickListener(new View.OnClickListener() {
- 2@Override 3 public void onClick(View v) {
- 4 Toast.makeText(MainActivity.this, "终于等到你", Toast.LENGTH_LONG).show();
- 5
- }
- 6
- });
(2.)使用 lambda 表达式
- 1 findViewById(R.id.to_web).setOnClickListener((View v) - >{
- 2 Toast.makeText(this, "终于等到你", Toast.LENGTH_LONG).show();
- 3
- });
(3.)进一步简化
- 1 findViewById(R.id.to_web).setOnClickListener(v - >Toast.makeText(this, "终于等到你", Toast.LENGTH_LONG).show());
在 Android studio 2.1 版本要想实现 Lambda 表达式的话可以采用第三方 AS retrolambda 插件来实现,github 地址:https://github.com/evant/gradle-retrolambda,同样那种方式仅仅支持 lambda 表达式而不支持 Java8 特性。
1.)中文乱码问题
这个问题我一直以为是编码问题,后来才发现是 jackOptions {enabled true} 引起的中文乱码,解决办法在 project 的 gradle.properties 中添加如下代码
- org.gradle.jvmargs = -Dfile.encoding = UTF - 8
2.)Instant Run 目前不能用于 Jack,目前建议暂时关闭 Instant Run 使用。
本文仅仅是学习了如何使用在 Android 开发中使用 Java8 的 lambda 表达式来使代码变得简洁,借来会逐步对 Java 的一些特性进行学习。
来源: http://www.cnblogs.com/whoislcj/p/6121832.html