优化 when 表达式 Kotlin 中的重复代码
Optimising a repeating code in when expression Kotlin
我的方法之一 returns 根据列表元素的布尔值,其大小可以从 0 到 4。我使用了 when
表达式,但“问题”是我的代码重复(冗余)。这是:
list.apply {
return when (size) { //size in 0..4
0 -> false
1 -> get(0) == 9
2 -> get(0) == 9 || get(0) == get(1) || get(0) + get(1) == 8
3 -> get(0) == 9 || get(0) == get(1) || get(0) + get(1) == 8 || get(0) == get(2) || get(0) + get(2) == 8
else -> get(0) == 9 || get(0) == get(1) || get(0) + get(1) == 8 || get(0) == get(2) || get(0) + get(2) == 8 || get(0) == get(3) || get(0) + get(3) == 8 // when size == 4
}
}
如您所见,下面的代码有很多重复。我找到了另一个解决方案,这个几乎不会重复,但我的印象是可以缩短代码(也许我错了?)。这是另一个版本(仍然在内联函数apply
):
var rtn = false
if (size > 0) rtn = rtn || get(0) == 9
if (size > 1) rtn = rtn || get(0) == get(1) || get(0) + get(1) == 8
if (size > 2) rtn = rtn || get(0) == get(2) || get(0) + get(2) == 8
if (size > 3) rtn = rtn || get(0) == get(3) || get(0) + get(3) == 8
return rtn
有什么办法可以进一步缩短或优化代码吗?在这两个版本中,哪个版本更受欢迎,为什么?
val result = with(list) {
isNotEmpty() && (first() == 9 || (1..lastIndex).any { first() == get(it) || first() + get(it) == 8 })
}
我的方法之一 returns 根据列表元素的布尔值,其大小可以从 0 到 4。我使用了 when
表达式,但“问题”是我的代码重复(冗余)。这是:
list.apply {
return when (size) { //size in 0..4
0 -> false
1 -> get(0) == 9
2 -> get(0) == 9 || get(0) == get(1) || get(0) + get(1) == 8
3 -> get(0) == 9 || get(0) == get(1) || get(0) + get(1) == 8 || get(0) == get(2) || get(0) + get(2) == 8
else -> get(0) == 9 || get(0) == get(1) || get(0) + get(1) == 8 || get(0) == get(2) || get(0) + get(2) == 8 || get(0) == get(3) || get(0) + get(3) == 8 // when size == 4
}
}
如您所见,下面的代码有很多重复。我找到了另一个解决方案,这个几乎不会重复,但我的印象是可以缩短代码(也许我错了?)。这是另一个版本(仍然在内联函数apply
):
var rtn = false
if (size > 0) rtn = rtn || get(0) == 9
if (size > 1) rtn = rtn || get(0) == get(1) || get(0) + get(1) == 8
if (size > 2) rtn = rtn || get(0) == get(2) || get(0) + get(2) == 8
if (size > 3) rtn = rtn || get(0) == get(3) || get(0) + get(3) == 8
return rtn
有什么办法可以进一步缩短或优化代码吗?在这两个版本中,哪个版本更受欢迎,为什么?
val result = with(list) {
isNotEmpty() && (first() == 9 || (1..lastIndex).any { first() == get(it) || first() + get(it) == 8 })
}