java - 有没有办法在 24 以下的 Android API 上使用 Java 8 功能接口(interface)?

标签 java android lambda functional-interface retrolambda

我可以使用 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 Level 24,但在其他设备上此代码会导致崩溃

java.lang.NoClassDefFoundError: com.retrolambdatry.MainActivity$$Lambda$1

我尝试启用 Java 8,而不是使用 retrolambda。前两个代码示例仍然有效,尽管黄油刀停止工作。 https://developer.android.com/preview/j8-jack.html#configuration这里ava.util.function据说是支持的,但是我运行第三个的时候还是会crash,这次有点不一样

java.lang.NoClassDefFoundError: com.retrolambdatry.MainActivity$-void_onCreate_android_os_Bundle_savedInstanceState_LambdaImpl1

最佳答案

不确定您是否还需要这个问题的答案,但其他人(比如我自己)可能会。

作为 3.0 版,Android Studio natively supports lambda functions以及所有 API 级别上的许多其他 Java 8 函数,但一些(如功能接口(interface)和 java.util.function)仍然仅限于 API 24+。

在扩展支持之前,android-retrostreams为其中的大部分提供反向移植支持。该项目是 streamsupport library 的“升级端口” ,您也可以使用它,并且具有 android-retrostreams 中的许多功能。 streamsupport 库支持低至 Java 6/7,因此即使您没有 AS 3.0+ 或不针对 Java 8,您也可以使用它,但在大多数情况下,您最好使用 android-retrostreams,如果你可以。您可以查看项目的 javadocs 以查看所提供的确切内容,但我使用的重点是 java.util.functionjava.util.Comparator

请注意,包名中的 java 已替换为 java9,并且某些类和/或方法名可能略有更改。例如:

java.util.function 变成 java9.util.function,

同时

java.util.Comparator 变为 java9.util.Comparators(方法名称和调用模式略有不同 - 但功能相同)。

关于java - 有没有办法在 24 以下的 Android API 上使用 Java 8 功能接口(interface)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38607149/

相关文章:

android - 从应用程序填写网络表格并提交

java - 在 JUnit 测试中,有没有一种方法可以确保所有断言都已执行?

python - 如何在lambda中上传pandas、sqlalchemy包避免报错 "Unable to import module ' lambda_function' : No module named 'importlib_metadata' "?

java - 如何一键删除数据库中的所有行

java - 将整个项目导入 Maven (Eclipse Juno)

java - 无法部署在Weblogic上

android - 创建具有自定义设计的选项卡小部件

Android getSimOperator() 因缺少权限而崩溃

python - Pandas 分配 Lambda 函数

java - 线程未更新 GlassPane 上的进度栏