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

sas*_*568 21 java lambda android functional-interface retrolambda

我可以使用retrolambda来启用Android API级别<24的lambdas.这样可行

myButton.setOnClickListener(view -> Timber.d("Lambdas work!"));
Run Code Online (Sandbox Code Playgroud)

这也有效

Runnable runLater = () -> Timber.d("Lambdas work!");
runLater.run();
Run Code Online (Sandbox Code Playgroud)

但是这个没有

Consumer<Integer> runLaterWithInt = (Integer i) -> Timber.d("i = " + i);
runLaterWithInt.accept(3);
Run Code Online (Sandbox Code Playgroud)

最后一个适用于Android API Level 24,但在其他设备上,此代码会导致崩溃

java.lang.NoClassDefFoundError: com.retrolambdatry.MainActivity$$Lambda$1
Run Code Online (Sandbox Code Playgroud)

我试图启用Java 8.而不是使用retrolambda.前两个代码示例仍然有效,尽管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
Run Code Online (Sandbox Code Playgroud)

Ver*_*mCH 21

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

作为3.0版本,Android Studio 本身支持所有API级别的lambda函数和许多其他Java 8函数,但有些(如功能接口和java.util.function)仍然仅限于API 24+.

在扩展支持之前,android-retrostreams为大多数支持提供了后端支持.这个项目是streamsupport库的"升级端口" ,您也可以使用它并且在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(并且具有略微不同的方法名称和调用模式 - 但功能相同).

  • 更正:[android-retrostreams](https://github.com/retrostreams/android-retrostreams)*如果考虑到Java 7 Oracle/OpenJDK VM,则不能在Java 7上运行.无论当前的Java版本是什不适用于Android Studio 2.3.x. 如果你需要一个确实*在真正的Java 6/7 VM(Sun等)上工作*的Stream API backport,你将不得不使用[streamsupport](https://sourceforge.net/projects/streamsupport/). (4认同)

laz*_*bug 9

Android 支持库(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()
    }
Run Code Online (Sandbox Code Playgroud)

  • 这个答案对我有帮助,因为我现在被 Java 困住了。干杯! (2认同)