到目前为止,我们大多数人都听说过Java 8将带来的很酷的功能,但Android不会支持它。这是因为谷歌在安卓上使用了Apache Harmony。这就是阻止我们( android应用程序开发人员)使用lambdas、接口中的默认实现、在字符串上切换等等来改进代码的原因。当然,我们会处理一段时间,但如果我们在应用程序中使用的一些库开始使用Java 8特性怎么办?据我所知,这是行不通的(如果错了,请纠正我)。这造成了Standard-Java和Android-Java之间的不兼容。这不可能是谷歌想要的,或者至少我想不出一个原因,为什么一家正在开发一个被广泛采用的操作系统的公司,不会永远停留在旧的Java版本上。
问题:
发布于 2014-10-05 06:59:51
你知道在当前的安卓系统上使用Java8类的方法吗?
有几个库支持Java 8 API的部分(请参阅下面的更新部分,了解最新Android版本对这些API的本地支持):
针对Android
java.util.function
(功能接口)和java.util.stream
(流) API的后端,适用于Java6或7的用户,并补充了java.util.concurrent
的精选功能,这些功能在Java6中并不存在。您可以使用retrolambda (以及gradle-retrolambda插件)在Android开发中使用lambda。
更新
Java Studio3.0开始提供对8语言特性的内置支持,这些特性包括:
静态接口Lambda expressions
另外,从API level 24开始,可以使用以下Java 8 API:
java.util.stream
java.util.function
java.lang.FunctionalInterface
java.lang.annotation.Repeatable
java.lang.reflect.AnnotatedElement.getAnnotationsByType(Class)
java.lang.reflect.Method.isDefault()
接口级别26 (Android O)增加了对java.time
接口的支持。
更新2020/01/17
Android Studio4.0支持使用多种Java8语言的API,通过使用名为desugaring的技术,无需的对您的应用程序要求最低API级别:
https://developer.android.com/studio/preview/features#j8-desugar
此版本支持以下API集:
java.util.{Map,Collection,Comparator}
java.time
java.util.function
AtomicReference
)
ConcurrentHashMap
子集(java.util.Optional
、java.util.OptionalInt
和java.util.OptionalDouble
)和其他一些有用的新类java.util.concurrent.atomic
的一些添加( AtomicInteger
、<代码>D82和Android 5.0的错误修复)<代码>H287<代码>F288为了支持这些语言API,D8编译一个单独的库DEX文件,该文件包含缺少的API的实现,并将其包含在您的应用程序中。去丑化过程会在运行时重写你的应用程序的代码,而不是使用这个库。
要启用对这些语言API的支持,请在模块的build.gradle
文件中包含以下内容:
android { defaultConfig { //将minSdkVersion设置为20或更低时需要multiDexEnabled true } compileOptions { //启用新语言API支持的标志coreLibraryDesugaringEnabled true //将Java兼容性设置为Java 8 sourceCompatibility JavaVersion.VERSION_1_8 targetCompatibility JavaVersion.VERSION_1_8 }}依赖项{ coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:1.0.4‘}
更多的技术细节可以在Jake的文章中找到:
发布于 2015-12-30 19:42:35
更新。
安卓计划使用OpenJDK。可能是因为他们的想法和您一样,并且想要使用Java8的特性。请参阅this
https://stackoverflow.com/questions/16921337
复制相似问题