如何使这个kotlin脚本做错误检查,但以习惯的方式返回一个值?



我在这里写了这个函数来获取gradle构建过程中需要的API key:

fun getApiKey(): String {
val keyFile = File("../whatever")
if (!keyFile.exists()) {
logger.error("whatever missing from parent directory")
}
val regex = "ARTIFACTORY_APIKEY: (\S+)".toRegex()
var key:String?  = null
keyFile.forEachLine {
val matchResult = regex.find(it)
if (matchResult != null) {
key = matchResult.groupValues[1]
}
}
if (key == null) {
logger.error("whatever doesn't contain API KEY")
}
return key!!
}

它完成工作(当我的文件丢失或有不良内容时给出有意义的错误消息),否则返回值。但是,它感觉太笨拙了,我相信一定有更优雅的方式来在gradle文件中表达这些功能。

我看不出有很大的改进空间。您可以使用File.useLines来获得一行的序列,这样您就不必处理多余的内容。它一次只读取一行,所以如果您在序列上使用firstOrNull(),它将不会读取超过满足您的谓词的第一行。

你可以从抛出异常而不是仅仅记录错误中获益,因为它避免了使用!!

fun getApiKey(): String {
val keyFile = File("../whatever")
if (!keyFile.exists()) {
throw GradleException("whatever missing from parent directory")
}
val regex = "ARTIFACTORY_APIKEY: (\S+)".toRegex()
return keyFile.useLines { lines ->
lines.mapNotNull { regex.find(it) }
.firstOrNull()
?: throw GradleException("whatever doesn't contain API KEY")
}.groupValues[1]
}

我将代码分成两个函数,像这样:

fun getApiKey(): String =
File("../whatever").apply { keyFile ->
if (!keyFile.exists()) {
logger.error("whatever missing from parent directory")
}
findKey(keyFile) ?: run {
logger.error("whatever doesn't contain API KEY")
""
}
}

fun findKeyInFile(keyFile: File): String?
{
val regex = "ARTIFACTORY_APIKEY: (\S+)".toRegex()
keyFile.forEachLine {
regex.find(it)?.let { matchResult ->
return@forEachLine matchResult.groupValues[1]
}
}

return null
}

我认为你的代码有一个潜在的错误,当你强制转换返回的key字符串(return key!!)。

实际上,如果值是null,那么它将抛出一个NullPointerException。在我的代码中,如果findKeyInFile函数返回null,我返回一个空字符串。

最新更新