Kotlin 如何正确地将函数转换为单个表达式函数以匹配数值和字符串资源?

Kotlin 如何正确地将函数转换为单个表达式函数以匹配数值和字符串资源?,kotlin,Kotlin,我试图在Kotlin中将几行代码转换成一个表达式函数。我正在传递一个Int值,该值将用于匹配并返回单个字符串资源。例如,如果value等于3,str将等于第三个资源字符串元素。因此,函数numToString将返回名为“third_sentece”的字符串值。这些字符串位于strings.xml文件中 这是需要改进的代码: fun numToString(value: Int, res: Resources): String { val str = when(value) {

我试图在Kotlin中将几行代码转换成一个表达式函数。我正在传递一个Int值,该值将用于匹配并返回单个字符串资源。例如,如果value等于3,str将等于第三个资源字符串元素。因此,函数numToString将返回名为“third_sentece”的字符串值。这些字符串位于strings.xml文件中

这是需要改进的代码:

fun numToString(value: Int, res: Resources): String {
    val str = when(value) {
        1 -> res.getString(R.string.first_sentece)
        2 -> res.getString(R.string.second_sentece)
        3 -> res.getString(R.string.third_sentece)
        4 -> res.getString(R.string.fourth_sentece)
        else -> res.getString(R.string.fifth_sentece)
    }
    return str
}
这就是我尝试过的。它不完整,因为(R.string…)缺少string.xml中的字符串名称。应根据先前传递的Int值设置

fun numToString(value: Int, res: Resources) = res.getString(value, res.getString(R.string))

Kotlin中有一些解决方案,但它们很可能在某一点上包括映射,可以是
Map
when
语句的形式

然而,在这个特定的案例中,看起来您应该进行调查。我已经有一段时间没有做Android开发了,但是如果你想做的是根据一个数值关联一个不同的文本,那么这很可能就是最好的方法

fun numToString(值:Int,res:Resources):字符串=
res.getQuantityString(R.plurals.numbers\u复数、值、值)
另一个选项是使用a,并通过将一减去
对其进行索引,以适应基于0的索引(
第一个
位于位置0,
第二个
位于位置1,等等):

fun numToString(值:Int,res:Resources):字符串{
val numberStrings=res.getStringArray(R.array.numbers\u数组)
返回数字字符串[值-1]
}
如果您不想使用这些,那么最好的选择是从
when
语句中提取公共部分:

fun numToString(值:Int,res:Resources):字符串{
val键=何时(值){
1->R.string.first
2->R.string.second
3->R.string.third
4->R.string.fourth
else->R.string.fifth
}
return res.getString(键)
}
如果您确实希望在此处使用一个表达式函数,为了清晰起见,可以创建两个函数:

有趣的numToString(value:Int,res:Resources):String=res.getString(getResourceKey(value)) fun getResourceKey(值:Int):字符串=何时(值){ 1->R.string.first 2->R.string.second 3->R.string.third 4->R.string.fourth else->R.string.fifth }
什么是
R
getString
资源的功能如何工作?如果您需要简单地将
Int
转换为编译时已知的
String
为什么不定义一个尊重的映射呢<代码>val numToStringMap=mapOf(1到“第一”,2到“第二”,3到“第三”,4到“第四”);val numToStringDefaultValue=“fifth”那么您的一行代码将是:
fun numToString(value:Int)=numToStringMap.getOrDefault(value,numToStringDefaultValue)
R指包含特定应用程序所有资源的所有定义的类。类资源用于访问应用程序的资源。其思想是检索名为“first”、“second”的字符串资源。。。基于作为参数传递的值。我想先映射,但这是我从应用程序的资源中获取字符串的要求。在本例中,它们位于strings.xml中。可以同时对资源进行映射吗?好的,那么您需要将
Int
映射到资源名称,然后通过其名称获取资源:
val numToStringMap=mapOf(1到R.string.first,2到R.string.second,3到R.string.third,4到R.string.fourth);val numToStringDefaultValue=R.string.fifth;有趣的numToString(value:Int,res:Resources)=res.getString(numToStringMap.getOrDefault(value,numToStringDefaultValue))
谢谢您的评论。映射它是一个很好的解决方案。但是,除了单表达式函数之外,它还需要几行代码。在上一个示例中,第一个函数,如果我们将res.getString(getResourceKey(value))替换为(value){1->R.string.first 2->……}时,它能工作吗?我测试了它,它能工作。感谢您的宝贵意见和建议examples@stcol我不明白。你刚才用第二个函数的函数体替换了第一个函数的函数体吗?为什么?您仍然需要解析键,对吗?您好@Joffrey,因为我试图将它变成一个表达式函数,所以我将两个函数组合在一起:fun numToString(value:Int,res:Resources):String=when(value){1->res.getString(R.String.first)…}。这样,我就可以将when块的结果设置为函数call@stcol是的,这是有效的,但这不是你在评论中写的,这就是为什么我感到困惑。不过,我通常在
语句中避免重复。这就是为什么我倾向于将选择的键提取到第二个方法中。我不明白您的目标是“仅仅”这个:),但您可能仍然希望查看其他相关资源(复数/数组)的设施。