我在 Gradle 中有多个 Provider
,并且希望将它们合并到单个 Provider
配置对象中,同时牢记惰性配置。
使用级联 Provider.flatMap
和 Provider.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.flatMap
和 Provider.map
合并到单个 Provider
:
val configProvider: Provider<Config> = envProvider.flatMap { env ->
accountProvider.flatMap { account ->
regionProvider.map { region ->
Config(
env = env,
account = account,
region = region
)
}
}
}
使用 project.provider
和 Provider.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 )。在您的情况下,如果您调用get
时envProvider
、accountProvider
或regionProvider
中的任何一个不存在值,那么你会得到一个异常(exception)。另一方面,它不会执行您为map
或flatMap
提供的 lambda,但您仍然会得到一个内部没有值的提供程序。map
和flatMap
返回一个实时的Provider
,这意味着即使您调用时该值不存在,转换也会只要存在值,您赋予map
或flatMap
的 lambda 就会被执行。使用get
,只有在没有值时才会出现异常。
关于kotlin - 在 Gradle 中合并多个提供程序。 Provider.map 与 project.provider 之间的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65925158/