有没有办法在低于24的Android API上使用Java 8功能接口?

我可以使用 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$1

我没有使用 retrolambda,而是尝试启用 Java 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

答案 1

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

作为3.0版本,Android Studio在所有API级别上原生支持lambda函数和许多其他Java 8函数,但有些(如Functional Interfaces和)仍然仅限于API 24 +。java.util.function

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

请注意,在包中,名称将替换为 ,并且某些类和/或方法名称可能已稍作更改。例如:javajava9

java.util.function成为java9.util.function

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


答案 2

安卓支持库(AndroidX)现在有和:ConsumerSupplier

可悲的是,在撰写时只添加了这两个接口

现在我们有了 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()
    }

推荐