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

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

});

用 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 numbers = new ArrayList<>();

numbers.addAll(Arrays.asList(1, 20, 3, 10, 20, 30, 4, 50, 80, 1, 2));

List 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'

}

新时间日期 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 的兼容性。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/301821.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

NET问答: 如何将十六进制的 #FFDFD991 转成 C# 中的 Color 类?

咨询区 viky&#xff1a;请问如何将一个16进制的 color code 转成 C# 中的 Color &#xff1f;我的业务场景中需要从文件读取一个 hex color code&#xff0c;然后我需要将该 code 转成 System.Windows.Media.Color 实例&#xff0c;不知道 .NET Framework 中是否有相关的支持类…

60 Minutes专访李开复:泛人工智能可能永远实现不了

全世界只有3.14 % 的人关注了数据与算法之美尽管你听说过人工智能&#xff0c;但机器仍然无法像人类一样思考&#xff0c;但在过去的几年里&#xff0c;它们已经具备了学习的能力。突然之间&#xff0c;我们的设备睁开了眼睛和竖起了耳朵&#xff0c;汽车开始无人行驶。今天&am…

API之子窗口创建 (转)

子窗口的创建非常非常重要 步骤&#xff1a;1、新建窗口类&#xff0c;在窗口类中指名对应的自定义的窗口过程。窗口类类名要唯一&#xff0c;它 是各窗口类相互区别的标识。注意&#xff0c;类名或为静态变量&#xff0c;或为全局变量&#xff0c;因为程 序随时都用他们。…

java 支付宝 退款_Java 支付宝支付,退款,单笔转账到支付宝账户(支付宝支付)

最近一直在接触第三方,刚接入完支付宝的API做一下总结,个人能力薄弱有不对的地方望指教. 做的是一个小型电商项目,所以会接入第三方的支付和登入功能, 第一次接入第三方撸了很多官方文档.然后创建应用选择需要接入的功能,有些应用是需要签约的签约就好了审核蛮快的.以上应用申…

DB排行榜更新,.NET Core+MySQL成主流!

上图是DB-Engines数据库流行度最新排行榜&#xff0c;Oracle、MySQL、SQLServer虽几经下滑&#xff0c;然而还是遥遥领先的前三名。后起之秀PostgreSQL和MongoDB持续增长&#xff0c;然而在体量上还相差甚远&#xff0c;可以预见这些年&#xff0c;三大关系型数据库的主流地位是…

史上最惨锦鲤即将来袭!奖品堪比5年高考3年模拟!

全世界只有3.14 % 的人关注了数据与算法之美在锦鲤盛行的2018年我们超级数学建模也跟风来了一个“史上最惨锦鲤”活动为什么叫史上最惨锦鲤呢因为平常看一本数学书就已经头疼了何况我们奖品还是100本数学书试问除了学霸还有谁能承受这种殊荣巧的是最后的得主还真是一个学霸那就…

iOS开发  plist字段列表,很全

http://www.dreamingwish.com/dream-category/learning-note/iphone-learning-note http://www.dreamingwish.com/dream-2012/plist-field-list-it-is.html bundle字段 这些字段名都是XML中的名称&#xff0c;在xcode的属性编辑器中&#xff0c;名字并不相同 bundle目录中的属性…

java对象 序列化_Java基础之对象序列化

1. 什么是Java对象序列化Java平台允许我们在内存中创建可复用的Java对象&#xff0c;但一般情况下&#xff0c;只有当JVM处于运行时&#xff0c;这些对象才可能存在&#xff0c;即&#xff0c;这些对象的生命周期不会比JVM的生命周期更长。但在现实应用中&#xff0c;就可能要求…

NET问答: 到底是返回 null 好,还是 空集合 好?

咨询区 Omu&#xff1a;我是一个 C# 菜鸟&#xff0c;说实话&#xff0c;这个问题是一个非常困惑于我们这样初学者的一个问题&#xff0c;我想知道实际开发中的 最佳实践 应该是什么样的&#xff1f;回答区 user1228&#xff1a;如果要我选的话&#xff0c;我会用 空集合&#…

人工智能读心术

全世界只有3.14 % 的人关注了数据与算法之美对于许多无法发出声音的人来说&#xff0c;他们想说的话会通过某种信号隐藏在大脑中。人类无法直接破译这些信号。但是&#xff0c;最近有三个研究小组在“破译”这种大脑语言密码上取得了一定进展。Science杂志最新报道了哥伦比亚大…

非彼拉且数列的实现

递归算法实现&#xff1a; public static int F(int n) {if(n0 || n1){return 1;}else{return F(n-1)F(n-2)}} 迭代算法实现&#xff1a; public static int Fx(int n ) {int i 1;int j 1;int temp 0;if(n 0 || n1){return 1;}for(int k 2; k<n; k){temp i j;i j;j…

今日港股期货(港股期货今日交易动向)

港股期货收涨0.6% 首次突破31000点 今日港股期货大涨&#xff0c;形势一时看好。其中&#xff0c;恒生指数期货一度突破31000点关口&#xff0c;创出历史新高。分析人士表示&#xff0c;市场情绪积极&#xff0c;投资者对于全球经济复苏前景和中国经济增长的预期不断提高&…

春节特惠活动┃一张纸一幅图,竟然提高了10倍的学习和工作效率!?

▲数据汪特别推荐点击上图进入玩酷屋人类大脑的容量远远超出一般人的想象&#xff0c;时到21世纪的今天&#xff0c;我们对大脑的运用远远不够。大脑机能的使用率基于我们的思维模式&#xff0c;而思维导图正是开发大脑中最有效的利器&#xff01;之前小木给大家推荐了一套基于…

java class文件 代码_java_基础——用代码编译.java文件+加载class文件

java_基础——用代码编译.java文件加载class文件java_基础——用代码编译.java文件加载class文件【简单编译的流程】package com.zjm.www.test;import java.io.IOException;import javax.tools.JavaCompiler;import javax.tools.JavaCompiler.CompilationTask;import javax.too…

WPF 记一个Popup踩坑记录

看名字就知道&#xff0c;它是一个弹出控件&#xff0c;顾名思义&#xff0c;我们可以用它来实现类似Combobox那种&#xff0c;点击后弹出下面选项列表的操作。记录&#xff1a;需求&#xff1a;有一个文本框 &#xff0c;鼠标点击后&#xff0c;弹出一个Popup。我编写了以下xa…

通过电话号码获取姓名 (+86或者飞信)

2019独角兽企业重金招聘Python工程师标准>>> /** * 通过电话号码获取姓名 (86或者飞信) */ /* public String getContactName(String phoneNum) { String contactName "";// 处理电话号码格式问题 if (phoneNum.length() > 11) {ContentResolver cr …

春节特惠活动┃强烈推荐!孩子的科普从这套全球畅销250万册的最酷科学书起步...

▲数据汪特别推荐点击上图进入玩酷屋在马斯的学生时代的记忆中&#xff0c;数学定义定理、化学方程式、物理公式……这些科学知识点总是冷冰冰的&#xff0c;枯燥、深奥也总是科学的代名词。如今教育局明确规定科学课是小学必修课&#xff0c;孩子也逐步接受科学知识的熏陶。但…

删除未使用的引用 | Visual Studio 2019(16.10)新功能试用

当解决方案很小时&#xff0c;我们清楚地知道解决方案中使用了哪些项目引用和NuGet包&#xff0c;要想清理它们很容易。而对于大型的解决方案&#xff0c;有哪些包在使用中&#xff0c;开发人员很难找到它们&#xff0c;或者找起来可能很耗时。Visual Studio 2019(16.10)添加了…

解决iPhone网络软件在睡眠情况断线问题

如果你希望使用iPhone的网络功能并保持长连接&#xff0c;并使用Wifi的话&#xff0c;你可能会发现一个问题&#xff0c;那就是在iPhone处于睡眠状态时&#xff0c;Wifi会中断&#xff0c;这样程序就无法保持连接。&#xff08;iPhone非官方SDK&#xff09; 下面的代码可能会帮…

java jli.dll_JVM、JRE、JDK之间的区别和联系,你居然还不知道?

JDK包含了JRE,JRE包含了JVMJDK:java开发工具包,针对java开发人员,可以编译运行java程序JRE:java运行时环境,针对使用java程序的客户,可以运行字节码(.class),但是不能编译Java源码JVM:用来解释执行字节码文件(.class),但不能正确的执行什么是JVMJVM是JRE的一部分,是虚拟出来的一…