3

我正在使用retrolambda,一些测试让我很困惑。

我的理解是:

  • 使用 retrolambda 我可以使用一些 java8 语言功能(例如 lambdas),但不能使用 java 8 类:例如,没有任何其他库,我不能使用 java8 流:HashSet<>.stream()不可用
  • 我用 java-8 特性(lambdas)编写我的代码。源代码被翻译成 java8-class 文件,然后 retrolambda 启动并将 java8-class 文件转换为 java7-class 文件,这些文件可以在较旧的 Android 版本(例如 Android 6)上执行

所以,我建立了一个小型测试项目来测试我的假设,有些事情我不确定。我希望有人能澄清一下。这是我的源代码的标签,我将参考。

  1. 在多模块 android 应用程序(一个 android 模块和一个纯 java 模块)中,我们必须将retrolambda gradle 插件应用于所有想要使用 java8 功能的模块(app 和 java)
    • 首先 java 模块会被 javac 编译成 java8-class 文件,retrolambda 会将它们转换成 java7 并构建一个 jar
    • 那么 app 模块将按照与 java 模块相同的方式编译:但现在我们得到的是 apk 而不是 jar:一切都是 java7 并且可以愉快地在 Android 6 上使用
  2. 在我的源代码中,我有一些单元测试,它们故意使用不应该工作的 java8 代码:我调用HashSet<>.stream()
    1. Android Studio 和模拟器:所有测试都有效
      • 我猜Android Studio & Emulators 甚至根本不使用retrolambda,只是将所有东西编译并运行到java8
      • 有没有办法改变它?:例如,如果任何测试已经发现了这些问题,那就太好了
    2. Gradle 命令行构建:
      • gradle clean app:test: 单元测试工作
      • gradle clean java:test: 单元测试失败
    3. 我不知道为什么 app 模块中的测试有效而 java 模块中的测试失败:为什么会这样?
  3. 正如预期的那样,在装有 Android 6 的真实设备上,一切都崩溃了
4

0 回答 0