我可以使用 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.function
和 java.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/