是否可以在Android API <24上使用Java 8 Stream API?

unl*_*101 80 java android java-8 java-stream

我在这里看过这篇文章.但我仍然无法在minSdkVersion <24上运行包含Java 8 Stream API功能的代码,如下所示.

List<Car> newCars = cars.stream()
                        .filter(s -> s.getColor().equals("red"))
                        .collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)

由于错误消息,这不会运行

调用需要API级别24(当前最小值为15):java.util.Collection #stream

那么有人知道解决方案吗?

Rob*_*ill 55

您不能在API级别<24上使用Java8流.

但是,有一些库反向移植了一些流功能

https://github.com/aNNiMON/Lightweight-Stream-API

https://github.com/konmik/solid

https://sourceforge.net/projects/streamsupport/(@sartorius在评论中提到)

  • 虽然[solid](https://github.com/konmik/solid)和[Lightweight-Stream-API](https://github.com/aNNiMON/Lightweight-Stream-API)无疑是类似Stream的宝贵选择编程,恕我直言,它们甚至都不能被远程视为Java 8 Stream API的"后端".我所知道的唯一可以声称与Java 8流语法接近并且与Java 8流功能相同的项目是[streamsupport](https://sourceforge.net/projects/streamsupport/).例如,它还支持并行流.虽然这对Android开发者来说可能并不那么重要. (8认同)
  • @Sartorius是对的 - 我建议查看Github镜像以获取使用细节,Gradle参考https://github.com/streamsupport/streamsupport (3认同)
  • @LordParsley streamsupport也有Gradle支持.至于额外的,是的,这是真的.据我了解,从官方Java 8 API扩展/转移从未成为streamsupport的设计目标. (2认同)

T. *_*art 12

DexGuard 8.2版本开始,也可以在Android设备<API级别24上使用Java 8流API.为此,需要包含streamsupport库,DexGuard将所有Java 8流API调用转换为提供的图书馆.无需额外处理,开发人员可以使用提供的Java 8流API进行简单编码.依赖关系也会自动转换,因此可以将具有Java 8功能的库用于Android开发.

此功能也将在不久的将来包含在ProGuard中,敬请关注.

编辑:已存在测试版的Proguard 6.1.0支持向后移植Java 8流和时间API.

  • @MichalHarakal,我花了几秒钟才意识到* layer *实际上是* law ** :) (3认同)

aer*_*ode 7

是的,是!从 AGP 4.0.0 开始,我们可以使用 Stream API 和其他一些 Java 8+ API(例如java.time

对您的应用的build.gradle 进行最少的更改:

android {
  compileOptions {
    // Flag to enable support for the new language APIs
    coreLibraryDesugaringEnabled true
  }
}

dependencies {
  coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:1.0.9'
}
Run Code Online (Sandbox Code Playgroud)


Abh*_*Roy 6

参加聚会可能有点晚了,但我刚刚看到如果我们使用,java8.util.stream.StreamSupport那么我们可以运行相同的函数式编程方法并在 Api 24 之前使用它。例如取自 web3j -

StreamSupport.stream(transactionReceipt.getLogs())
            .map(log -> extractEventParameters(event, log))
            .filter(Objects::nonNull)
            .collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)

  • @AjahnCharles 当人们的问题涉及语言 A 时告诉人们只使用语言 B 并不是一个好的答案。许多项目仍然是用 Java 编写的。 (3认同)
  • @AjahnCharles 当它明确提到“Java 8 Stream API”时,我觉得,答案也应该在JAVA中! (3认同)
  • @AjahnCharles 你提出了一个很好的观点,即吸引读者注意_可能_考虑 Android 生态系统的变化。也就是说,问题是关于 Java 的一个特定功能,Java 仍然是 Android 开发的官方支持语言。即使“仅”混合您的应用程序,切换也会带来成本(学习曲线,也许他们的团队不支持等),并且这需要深入研究_way_而不是问题中所要求的内容。更重要的是,该评论没有说明 Kotlin 是一种解决方案,这使得它更加断章取义,而且帮助不大。 (2认同)