Kotlin 扩展函数突然需要 api 级别 24

Kotlin Extension Functions suddenly require api level 24

我刚刚注意到这个 lint 错误:

Call requires API Level 24 (current min is 19) java.util.map#foreach

当我在 Kotlin 的 MutableMap 上使用扩展函数 forEach 时。 当我写这行时这并没有发生,但它现在就在那里。 我在我的另一台机器上没有看到这个错误。

您使用的不是kotlin.collections.MutableMap.forEach

你用的好像是Map.forEach in Java 8.

参考这篇文章: http://blog.danlew.net/2017/03/16/kotlin-puzzler-whose-line-is-it-anyways/

这似乎是一个常见的错误。

Java 8 从 Android API 级别 24 得到很好的支持。

简而言之,不要像map.forEach { t, u -> Log.i("tag", t + u) }那样使用forEach(这是使用Java 8 API,它不适用于Android API 等级 <= 23).
map.forEach { (t, u) -> Log.i("tag", t + u) } 一样使用它(这是使用 Kotlin API)。
(不是两个参数。只有一个参数是一对。)

Map.forEach 在 Java 8 中得到支持,在 Android 中的支持从 API 24

开始

这也发生在列表中,即使我正在使用我需要使用:

list.iterator().forEach {}

关键是在 forEach 之前使用 iterator()

运行 因为提供的依赖项映射是 Java 8 映射,所以 forEach 被检测为 Java 8 版本,无论如何我将我的参数分组在 lambda 签名中(one, two ->(one, two) ->)。我能找到的最佳解决方案是使用带有别名 (import kotlin.collections.forEach as kForEach) 的显式导入。别名使优化导入不会删除显式导入。