我看过很多Gradle项目都有这样的功能:

tasks.withType<KotlinCompile> {
    kotlinOptions {
        jvmTarget = "17"
    }
}

我还看到许多Gradle项目包含以下内容:

tasks.withType<KotlinCompile>().configureEach {
    kotlinOptions {
        jvmTarget = "17"
    }
}

这些是一样的吗?如果不是,有何分别?什么时候应该使用其中一种而不是另一种?

推荐答案

withType<T>withType<T>().configureEach都对类型T的域对象集合1执行操作.然而,他们这样做有一个不同之处:

  • withType(),当传递一个动作作为参数时,立即执行该动作,并且还对随后添加到原始集合的指定类型的任何域对象执行该动作.

  • configureEach()惰性地执行其动作,使得该动作仅在从集合请求特定域对象时在该域对象上运行.

因此,当您希望在每次调用构建时在该类型的所有对象上运行操作时,withType是合适的.比方说,您可以使用它为该类型的每个对象创建单独的任务.

如果您只想在调用生成所需的时候为该类型的对象运行操作,则withType().configureEach比较合适.这通常适用于任务,因为避免配置给定构建不需要的任务效率更高.

因此,对于Task个对象,通常建议将configureEachwithType结合使用.


1在您的示例中,有Task个对象.但是,它可以应用于构建定义的其他域对象,如编译.

Kotlin相关问答推荐

在KMP中使用koin将来自Android的上下文注入到SQLDelight Driver中

Jetpack Compose中的数字 Select 器问题

数据流弹性模板失败,出现错误&未知非复合转换urn";

使函数同时挂起和取消挂起

为什么可组合对象看似无状态(唯一传递的参数是函数,而不是状态),但会进行重组

collectAsState 未从存储库接收更改

为什么会出现Kotlin.Unit错误以及如何修复它?

如何在 Kotlin 中不受约束?

如何在 jOOQ 中两次加入同一张表?

parallelStream()和asSequence().asStream().parallel()之间的区别

Kotlin 有垃圾收集器吗?如果是这样,它基于哪种算法?

Android Studio 4.0.0 Java 8 库在 D8 和 R8 构建错误中脱糖

使用 clear() 删除 EncryptedSharedPreferences 不起作用

Kotlin - 来自 KType 的 KClass<*>

如何在Kotlin中创建填充空值的通用数组?

未找到导入 kotlinx.coroutines.flow.*

Kotlin 的 Double.toInt() 中使用了哪种方法,舍入还是截断?

Jetpack Compose-居中文本

如何让数据类在Kotlin中实现接口/扩展超类属性?

类型推断失败:RecyclerViewActions.scrollTo()