有没有办法在24以下的AndroidAPI上使用Java8个功能接口?
Is there a way to use Java 8 functional interfaces on Android API below 24?
我可以使用 retrolambda 启用 Android API 级别 <24 的 lambda。
所以这有效
myButton.setOnClickListener(view -> Timber.d("Lambdas work!"));
这也有效
Runnable runLater = () -> Timber.d("Lambdas work!");
runLater.run();
但是这个没有
Consumer<Integer> runLaterWithInt = (Integer i) -> Timber.d("i = " + i);
runLaterWithInt.accept(3);
最后一个适用于 Android API 24 级,但在其他设备上此代码会导致崩溃
java.lang.NoClassDefFoundError: com.retrolambdatry.MainActivity$$Lambda
我尝试启用 Java 而不是使用 retrolambda 8. 尽管 butterknife 停止工作,但前两个代码示例仍然有效。 https://developer.android.com/preview/j8-jack.html#configuration这里ava.util.function
据说是支持的,但是我在运行第三个的时候还是卡死了,这次有点不一样
java.lang.NoClassDefFoundError: com.retrolambdatry.MainActivity$-void_onCreate_android_os_Bundle_savedInstanceState_LambdaImpl1
allprojects {
repositories {
maven { url 'https://jitpack.io' }
}
}
dependencies {
compile 'com.github.ipcjs:java-support:0.0.3'
}
不确定您是否还需要这个问题的答案,但其他人(比如我)可能会。
作为 3.0 版,Android Studio natively supports lambda functions 和许多其他 Java 8 个功能在所有 API 级别上,但一些(如功能接口和 java.util.function
) 仍然限于 APIs 24+.
在扩展支持之前,android-retrostreams provides backport support for most of it. This project is an 'upgraded port' of the streamsupport library,您也可以使用它并具有 android-retrostreams 中的许多功能。 streamsupport 库支持低至 Java 6/7,因此即使您没有 AS 3.0+ 或不以 Java 8 为目标也可以使用它,但您最好还是使用android-如果可以的话,在大多数情况下都是retrostreams。您可以浏览该项目的 javadoc 以准确了解所提供的内容,但我使用的重点是 java.util.function
和 java.util.Comparator
.
请注意,包名称中的 java
已替换为 java9
,并且某些 class and/or 方法名称可能已略有更改。例如:
java.util.function
变为 java9.util.function
,
而
java.util.Comparator
变为 java9.util.Comparators
(方法名称和调用模式略有不同 - 但功能相同)。
对于上面提到的 Lightweight-Stream-API also provides backport support. Like android-retrostreams 替代方案,您必须使用以下方法替换一些包名称:
com.annimon.stream.function
而不是 java.util.function
com.annimon.stream.ComparatorCompat
而不是 java.util.Comparator
Android 支持库 (AndroidX) 现在有 Consumer
和 Supplier
:
- androidx.core.util.Consumer(出现在
androidx.appcompat:appcompat:1.0.2
)
- androidx.core.util.Supplier(出现在
androidx.appcompat:appcompat:1.1.0-alpha01
)
很遗憾 only these two interfaces gets added 撰写本文时。
现在有了 Kotlin,它不需要您明确指定功能接口:
fun test() {
val text = withPrintStream {
it.println("Header bla bla ")
it.printf("%s, %s, %s,", "a", "b", "c").println()
}
}
// Equivalent to the following code in Java:
// Consumer<PrintStream> action;
// action.accept(ps);
fun withPrintStream(action: (PrintStream) -> Unit): String {
val byteArrayOutputStream = ByteArrayOutputStream()
val ps = PrintStream(byteArrayOutputStream)
action(ps)
ps.flush()
return byteArrayOutputStream.toString()
}
Android Gradle 插件 (AGP) 4.0+ 添加对 java8 包的向后移植支持(例如 java.util.function,添加到 Android API 24) 低 API 版本:
见https://developer.android.com/studio/write/java8-support#library-desugaring
将下面代码中的行添加到 APP 模块允许我使用 openAPI-generator 5.1.0 生产的 java jersey API-SDK 模块和 Android API < 24(我使用 jersey 以获得更好的多态性支持)
android {
defaultConfig {
// Required when setting minSdkVersion to 20 or lower
multiDexEnabled true
}
compileOptions {
// Flag to enable support for the new language APIs
coreLibraryDesugaringEnabled true
// Sets Java compatibility to Java 8
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
}
dependencies {
coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:1.1.5'
}
我可以使用 retrolambda 启用 Android API 级别 <24 的 lambda。 所以这有效
myButton.setOnClickListener(view -> Timber.d("Lambdas work!"));
这也有效
Runnable runLater = () -> Timber.d("Lambdas work!");
runLater.run();
但是这个没有
Consumer<Integer> runLaterWithInt = (Integer i) -> Timber.d("i = " + i);
runLaterWithInt.accept(3);
最后一个适用于 Android API 24 级,但在其他设备上此代码会导致崩溃
java.lang.NoClassDefFoundError: com.retrolambdatry.MainActivity$$Lambda
我尝试启用 Java 而不是使用 retrolambda 8. 尽管 butterknife 停止工作,但前两个代码示例仍然有效。 https://developer.android.com/preview/j8-jack.html#configuration这里ava.util.function
据说是支持的,但是我在运行第三个的时候还是卡死了,这次有点不一样
java.lang.NoClassDefFoundError: com.retrolambdatry.MainActivity$-void_onCreate_android_os_Bundle_savedInstanceState_LambdaImpl1
allprojects {
repositories {
maven { url 'https://jitpack.io' }
}
}
dependencies {
compile 'com.github.ipcjs:java-support:0.0.3'
}
不确定您是否还需要这个问题的答案,但其他人(比如我)可能会。
作为 3.0 版,Android Studio natively supports lambda functions 和许多其他 Java 8 个功能在所有 API 级别上,但一些(如功能接口和 java.util.function
) 仍然限于 APIs 24+.
在扩展支持之前,android-retrostreams provides backport support for most of it. This project is an 'upgraded port' of the streamsupport library,您也可以使用它并具有 android-retrostreams 中的许多功能。 streamsupport 库支持低至 Java 6/7,因此即使您没有 AS 3.0+ 或不以 Java 8 为目标也可以使用它,但您最好还是使用android-如果可以的话,在大多数情况下都是retrostreams。您可以浏览该项目的 javadoc 以准确了解所提供的内容,但我使用的重点是 java.util.function
和 java.util.Comparator
.
请注意,包名称中的 java
已替换为 java9
,并且某些 class and/or 方法名称可能已略有更改。例如:
java.util.function
变为 java9.util.function
,
而
java.util.Comparator
变为 java9.util.Comparators
(方法名称和调用模式略有不同 - 但功能相同)。
对于上面提到的 Lightweight-Stream-API also provides backport support. Like android-retrostreams 替代方案,您必须使用以下方法替换一些包名称:
com.annimon.stream.function
而不是 java.util.function
com.annimon.stream.ComparatorCompat
而不是 java.util.Comparator
Android 支持库 (AndroidX) 现在有 Consumer
和 Supplier
:
- androidx.core.util.Consumer(出现在
androidx.appcompat:appcompat:1.0.2
) - androidx.core.util.Supplier(出现在
androidx.appcompat:appcompat:1.1.0-alpha01
)
很遗憾 only these two interfaces gets added 撰写本文时。
现在有了 Kotlin,它不需要您明确指定功能接口:
fun test() {
val text = withPrintStream {
it.println("Header bla bla ")
it.printf("%s, %s, %s,", "a", "b", "c").println()
}
}
// Equivalent to the following code in Java:
// Consumer<PrintStream> action;
// action.accept(ps);
fun withPrintStream(action: (PrintStream) -> Unit): String {
val byteArrayOutputStream = ByteArrayOutputStream()
val ps = PrintStream(byteArrayOutputStream)
action(ps)
ps.flush()
return byteArrayOutputStream.toString()
}
Android Gradle 插件 (AGP) 4.0+ 添加对 java8 包的向后移植支持(例如 java.util.function,添加到 Android API 24) 低 API 版本:
见https://developer.android.com/studio/write/java8-support#library-desugaring
将下面代码中的行添加到 APP 模块允许我使用 openAPI-generator 5.1.0 生产的 java jersey API-SDK 模块和 Android API < 24(我使用 jersey 以获得更好的多态性支持)
android {
defaultConfig {
// Required when setting minSdkVersion to 20 or lower
multiDexEnabled true
}
compileOptions {
// Flag to enable support for the new language APIs
coreLibraryDesugaringEnabled true
// Sets Java compatibility to Java 8
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
}
dependencies {
coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:1.1.5'
}