文档章节

四个库,让你在 Android 中启用 Java 8 功能

达尔文
 达尔文
发布于 2016/12/07 22:04
字数 1672
阅读 3859
收藏 81

Java 8 的推出引入很多革命性变化,加入了函数式编程的特征,使基于行为的编程成为可能,同时简化了各种设计模式的实现方式,是 Java 有史以来最重要的更新。

自 Android N 之后,由于 Jack&Jill 编译工具链的存在,Java 8 的一些语言功能终于得到了支持。虽然还存在一些限制,如,新编译器附带的数据绑定支持库无法使用,以及注释支持受限等,但这完全不足以否定 Java 8 中存在的其他先进功能。在这篇文章中,作者介绍了在 Android 中引入 Java 8 功能的四个库,希望它们对你有帮助。

文章如果有翻译不到位的地方,欢迎大家进行指正。喜欢的也不要忘了点赞、打赏、收藏哦~

Java 8 在 Android M(6.0)及更低版本中的功能

Java 8 的发布引入了一些新特性。在所有功能中较为重要的有 lambda 表达式,方法引用,Stream API 和新的时间日期 API。

目前,Jack&Jill 编译工具链还处于早期开发阶段,它比较容易与 Java 7 保持同步。另外,很幸运的是,现在有几款库还能将 Android 中 的 Java 8 移植到更低版本的编译器中。让我们来看看它们是如何发挥作用的。

Lambda 表达式

伴随 Java 8 的发布而发布的 lambda 表达式,允许你使用参数传递代码块。它们可以用于代替类的匿名实例,例如,对单击按钮时执行的操作进行定义。下面我演示了使用匿名类和 lambda 表达式在按钮上设置 onClick 监听器:

// Anonymous class approach:
button.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View view) {
        // onClick action here
    }
});
// Lambda expresssion approach:
button.setOnClickListener(view -> {
    // onClick action here
});

如果想了解有关 lambda 表达式的更多信息,可以参阅 Java 8 中的 Lambda 表达式Android 中的 Lambda 表达式

用 Retrolambda 实现 Java 6 和 7 中的 Lambda 表达式功能

使用 Retrolambda 能很快实现 Java 6 和 Java 7中的Lambda 表达式功能,将它应用在 Android 上也是一样。Retrolambda 能转换 Java 8 编译的字节码,以便它在更低版本的 Java 中运行此代码,而不需要任何附加的依赖关系。

要在 Android Studio 项目中使用 retrolambda,需要将下列代码添加到项目级别的 build.gradle 文件中:

buildscript {
    repositories {
        jcenter()
        mavenCentral()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:2.1.2'
        classpath 'me.tatarka:gradle-retrolambda:3.2.5'
    }
}
...

模块级 build.gradle 文件应包含以下突出显示的代码行:

apply plugin: 'com.android.application'
apply plugin: 'me.tatarka.retrolambda'

android {
    compileSdkVersion 23
    buildToolsVersion "24.0.1"

    defaultConfig {
        applicationId "com.example.lambdas"
        minSdkVersion 16
        targetSdkVersion 23
        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
    }
}

遵循以上步骤,你已经能够成功地在 Android上启用 Java 8 的其中一项功能。

方法引用(Method References)

方法引用可以很方便地与 lambda 表达式一起使用,以简化语法。例如,如果一个 lambda 表达式主体包含一个类方法调用,它可以替换为一个方法引用:

Arrays.sort(new Integer[] {1, 2, 3},
    (first, second) -> first.compareTo(second));
Arrays.sort(new Integer[] {1, 2, 3}, Integer::compareTo);

参数会自动提供以匹配方法签名(method signature)。

这里存在三种::运算符用法:

  • object::instanceMethod
  • Class::staticMethod 
  • Class::instanceMethod

你可点击此处了解更多有关方法引用和构造函数引用的信息。

如果你已经使用 retrolambda 库启用了 lambda 表达式,方法引用此时也能正常运行,因为此功能是包含在内的。如果没有,请你参考上一节的内容。

Stream API

Java 8 另一个了不起的语言特性就是 Stream API,Stream 表示抽象层,允许开发人员以声明方式处理底层数据。它的另一个好处就是能对 Stream 采取并行执行操作,这有利于开发人员有效地处理大量数据,而不必为并发和线程管理担心。

例如,我们有一个数字列表,需要过滤出小于 10 的数字,然后返回其余的排序列表。使用 Stream API,事代码表现更美观:

List<Integer> numbers = new ArrayList<>();
numbers.addAll(Arrays.asList(1, 20, 3, 10, 20, 30, 4, 50, 80, 1, 2));

List<String> large_number = numbers.stream()
        .filter(num -> num >= 10)
        .sorted()
        .collect(Collectors.toList());

这仅是 Stream API 提供的一个简单示例。 有关 Java 中的 Stream 的更多信息,请参阅 Java 8 中的 Stream API

在 Android 中,我们有两个库,可以从 Stream API 中选择,我们来看下:

Lightweight-Stream-API

Lightweight-Stream-API 库将 Stream API 反向运行到 Java 7,并通过使用迭代器重写 API 来降低版本。该库在原始 Java 8 实现中提供了许多 Stream 操作符,其中有一些是新的,如:sortBy,groupBy,chunkBy,sample,slidingWindow 等。

将库包含到 Android 项目中是为了给 build.gradle 文件中的依赖项添加单独的一行:

dependencies {
  ...
  compile 'com.annimon:stream:1.1.3'
  ...
}

由于该库已经重新实现 Stream API 的方式,一些语法会与原始的 Stream 实现不同,并且并行执行也被省略。 更多信息,请参阅 Github 上的库页面

streamsupport

第二个将 Stream API 从 Java 8 回退到更低版本的库就是 streamsupport 库。与 Lighweight-Stream-API 相比,streamsupport 除了具有并行执行功能和 Java 9 的增强功能外,还有一些其他的功能,如,Java 8 的功能接口或可选模式。

为了在您的项目中使用 streamsupport 库,请将以下依赖项添加到 build.gradle 文件中:

dependencies {
    compile 'net.sourceforge.streamsupport:streamsupport:1.5.2'
    compile 'net.sourceforge.streamsupport:streamsupport-cfuture:1.5.2'
    compile 'net.sourceforge.streamsupport:streamsupport-atomic:1.5.2'
    compile 'net.sourceforge.streamsupport:streamsupport-flow:1.5.2'
    compile 'net.sourceforge.streamsupport:streamsupport-literal:1.5.2'
}

更多信息,请参阅 Github 上的 streamsupport 库

新时间日期 API

Java 8 之前的版本不太支持日期和时间的设置。虽然也有几个支持的 API,但它们各自都存在问题。为解决这些问题,Java 8 带来了新时间日期,你可以点击此处了解更多相关信息。

ThreeTen Android Backport

虽然 Android 不支持 Java 8 中的时间日期 API,但一个名为 ThreeTen Android Backport 的库可以提供相同的功能。

使用之前,请将以下行添加到 build.gradle 文件中:

compile 'com.jakewharton.threetenabp:threetenabp:1.0.4'

结论

在这篇文章中,我介绍了在 Android 中引入 Java 8 功能的四个库。 使用这些库,您可以在 Android 中使用 lambda 表达式,方法引用,Stream API 或新日期时间 API,而无需迁移到新的 Jack&Jill 编译器工具链,同时还能保持与以前版本的 Android 和 Java 的兼容性。

本文翻译自 Milan Bárta 的 Enable Java 8 features in Android with these libraries

© 著作权归作者所有

达尔文

达尔文

粉丝 449
博文 25
码字总数 34746
作品 0
深圳
运营/编辑
私信 提问
加载中

评论(7)

宇宙蒙面侠X
宇宙蒙面侠X

引用来自“xytest01”的评论

直接上kotlin
+1
MaxSherry
MaxSherry

引用来自“xytest01”的评论

直接上kotlin
+1024
看法宝
看法宝
满分@胡胖胖
Jeese
Jeese

引用来自“_coco”的评论

装逼使用利器

绝对逼格满分。
x
xytest01
直接上kotlin
_coco
_coco
装逼使用利器
xiaolei123
xiaolei123
收藏了
[译] Java、Kotlin、RN、Flutter 开发出来的 App 大小,你了解过吗?

现在开发 App 的方式非常多,原生、ReactNative、Flutter 都是不错的选择。那你有没有关注过,使用不同的方式,编译生成的 Apk ,大小是否会有什么影响呢?本文就以一个最简单的 Hello Worl...

承香墨影
2018/10/29
0
0
如何写出低碳环保的 Android 代码

随着环境问题越来越严重,人们越来越重视低碳环保的生活方式。作为码农的我们自然也应该为环保做出应有的贡献。那么什么是低碳环保,简而言之就是就是低能量、低消耗、低开支的生活方式,映射...

力谱宿云
2016/04/28
139
0
Android Studio 3.0 正式发布,支持 Kotlin 语言

除了 Android 8.1 Oreo 开发者预览版,Google 今日还正式发布了 Android Studio 3.0 ,为其 IDE 引入了一系列新功能。 Android Studio 3.0 专注于加速 Android 应用开发,包含大量更新内容,...

王练
2017/10/26
16.9K
57
15个开发者最亲睐的Andr​​oid代码编辑器

如果你希望你的Android设备,如智能手机和平板电脑,在任何时间和任何地方都能够编写代码,那么,不妨看看下面我将介绍的15款Android代码编辑器,它们必将成为你的理想工具。 1.Deuter IDE 一...

拉偶有所依
2015/03/19
531
0
Android 必备开发包下载

作为Android开发的爱好者,您应该而且也必须要拥有下面的几个开发包才能进行基本的开发,没有的赶紧下载吧!下面的开发包主要有Android SDK、Java运行时库(JRE)、Eclipse、ADT插件等。 官方下...

无鸯
2011/09/15
21.2K
2

没有更多内容

加载失败,请刷新页面

加载更多

32位与64位Linux系统下各类型长度对比

64 位的优点:64 位的应用程序可以直接访问 4EB 的内存和文件大小最大达到4 EB(2 的 63 次幂);可以访问大型数据库。本文介绍的是64位下C语言开发程序注意事项。 1. 32 位和 64 位C数据类型...

mskk
20分钟前
6
0
Vue 实现点击空白处隐藏某节点(三种方式:指令、普通、遮罩)

在项目中往往会有这样的需求: 弹出框(或Popover)在 show 后,点击空白处可以将其 hide。 针对此需求,整理了三种实现方式,大家按实际情况选择。 当然,我们做项目肯定会用到 UI 框架,常...

张兴华ZHero
26分钟前
7
0
SpringBoot激活profiles你知道几种方式?

多环境是最常见的配置隔离方式之一,可以根据不同的运行环境提供不同的配置信息来应对不同的业务场景,在SpringBoot内支持了多种配置隔离的方式,可以激活单个或者多个配置文件。 激活Profi...

恒宇少年
28分钟前
7
0
PDF修改文字的方法有哪些?怎么修改PDF文件中的文字

PDF修改文字一直以来都是一个难以解决的问题,很多的办公族在办公的时候会有修改PDF文件中的文字的需要,可是PDF文件一般是不能进行编辑和修改的,难道就没有什么办法解决这个问题了嘛?不要...

趣味办公社
31分钟前
5
0
企业组织中采用服务网格的挑战

作者:Christian Posta 译者:罗广明 原文:https://blog.christianposta.com/challenges-of-adopting-service-mesh-in-enterprise-organizations/ 编者按 本文作者介绍了企业组织采用服务网...

jimmysong
41分钟前
8
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部