【发布时间】:2016-07-27 08:00:30
【问题描述】:
我可以使用 retrolambda 来启用 Android API 级别
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据说支持,但是我运行第三个的时候还是会崩溃,这次有点不一样
java.lang.NoClassDefFoundError: com.retrolambdatry.MainActivity$-void_onCreate_android_os_Bundle_savedInstanceState_LambdaImpl1
【问题讨论】:
-
这个问题的标题不好; lambdas 实际上被向后移植到旧的 Android 版本,所以你不需要 Retrolambda。只需安装新的 Android Studio 和构建工具。
-
也许它的标题不好。据我了解,如果我有 Android N SDK 并且启用 Jack 编译选项,则不需要 retorlambda。无论哪种方式,Lambda 都可以工作。但是来自“java.util.function”的功能接口仍然没有。
-
问题是 Jack 编译器阻止了数据绑定库的使用(参见here)。这就是为什么很多人目前可能不愿意使用 Jack,而是使用 Retrolambda 作为获取 lambda 表达式的替代方案(直到这些问题在未来的 Android Studio 版本中得到修复)。
标签: java android lambda functional-interface retrolambda