kotlin - 在 Gradle 中合并多个提供程序。 Provider.map 与 project.provider 之间的区别

标签 kotlin gradle build.gradle gradle-kotlin-dsl

我在 Gradle 中有多个 Provider,并且希望将它们合并到单个 Provider 配置对象中,同时牢记惰性配置。

使用级联 Provider.flatMapProvider.map 与使用 project.provider 创建新的 Provider 之间有什么区别 & 使用Provider.get()

给定多个提供者:

// build.gradle.kts

val envProvider: Provider<String> = project.provider {
    val env: String? by project
    env ?: "sit"
}

val accountProvider: Provider<String> = project.provider {
    val account: String by project
    account
}

val regionProvider: Provider<String> = project.provider {
    val region: String? by project
    region ?: "us-east-1"
}

使用 Provider.flatMapProvider.map 合并到单个 Provider:

val configProvider: Provider<Config> = envProvider.flatMap { env ->
    accountProvider.flatMap { account ->
        regionProvider.map { region ->
            Config(
                env = env,
                account = account,
                region = region
            )
        }
    }
}

使用 project.providerProvider.get 合并到单个 Provider:

val configProvider: Provider<Config> = project.provider {
    Config(
        env = envProvider.get(),
        account = accountProvider.get(),
        region = regionProvider.get()
    )
}

最佳答案

来自 get() 的文档:

Returns the value of this provider if it has a value present, otherwise throws {@code java.lang.IllegalStateException}.

来自 map()flatMap() 的文档:

The new provider will be live, so that each time it is queried, it queries this provider and applies the transformation to the result. Whenever this provider has no value, the new provider will also have no value and the transformation will not be called.

使用 Provider.get()Provider.map & Provider.flatMap 时有 2 个区别

  • 当没有值存在时,调用 get() 将引发异常,而调用 map()flatMap() 将引发异常> 将不会运行您给出的转换。 ( lambda block )。在您的情况下,如果您调用 getenvProvideraccountProviderregionProvider 中的任何一个不存在值,那么你会得到一个异常(exception)。另一方面,它不会执行您为 mapflatMap 提供的 lambda,但您仍然会得到一个内部没有值的提供程序。

  • mapflatMap 返回一个实时的 Provider,这意味着即使您调用时该值不存在,转换也会只要存在值,您赋予 mapflatMap 的 lambda 就会被执行。使用get,只有在没有值时才会出现异常。

关于kotlin - 在 Gradle 中合并多个提供程序。 Provider.map 与 project.provider 之间的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65925158/

相关文章:

gradle - 使用gradle从Jacoco报告中排除软件包

android - 避免gradle构建参数进行干净的任务

gradle - 如何在 gradle 中插入自定义任务

java - 过滤特定库的 gradle 配置

android - Kotlin 委托(delegate)内存使用

android - 为什么它说 "Calls to launch should happen inside a LaunchedEffect and not composition"?

java - 使用 gradle 从 java 项目中删除未使用的导入

java - Android 中添加到 gradle 的类文件可以编辑吗?

android - kotlin-类不是抽象的,不实现抽象基类成员(RecyclerView)

android-studio - 在Android Studio中使用导航框架时,如何知道保留的类名或关键字?