Kotlin中如何获取数组前n个元素及take方法报错问题排查
Kotlin数组与集合操作问题解答
1. 在Kotlin语言中,如何获取一个数组的前n个元素?
在Kotlin里获取数组前n个元素超简单,直接调用数组的take(n)方法就搞定了!这个方法会返回原数组前n个元素组成的List,如果你的场景需要保持数组类型,只需要再调用toTypedArray()做个转换就行。
举个实际的例子:
// 定义一个整数数组 val numbers = arrayOf(1, 2, 3, 4, 5, 6) // 获取前3个元素,得到List<Int> val firstThreeElements = numbers.take(3) // 如果需要数组类型,转换一下 val firstThreeArray = numbers.take(3).toTypedArray() println(firstThreeElements) // 输出: [1, 2, 3] println(firstThreeArray.contentToString()) // 输出: [1, 2, 3]
另外要注意,如果数组的长度小于n,take(n)会返回整个数组的元素,不会抛出异常,这点很贴心~
2. 调用allColours.take方法时触发“Expecting an element”错误,该如何解决?
遇到这个错误,咱们可以从几个常见原因入手排查,逐个解决:
原因1:类型不匹配导致赋值失败
如果pegColours是Array<Pair<*, *>>类型,而take()方法返回的是List<Pair<*, *>>,直接赋值会因为类型不兼容触发编译错误。这时候只需要把List转换成数组即可:
// 假设allColours是List<Pair<Color, String>>类型 val allColours = listOf( Pair(Color.RED, "Red"), Pair(Color.BLUE, "Blue"), Pair(Color.GREEN, "Green"), Pair(Color.YELLOW, "Yellow") ) // 先take(3)得到List,再转成数组赋值给pegColours val pegColours: Array<Pair<Color, String>> = allColours.take(3).toTypedArray()
原因2:allColours为空或元素不足3个
如果allColours是空集合,或者元素数量少于3个,take(3)会返回一个空的或长度不足的List。如果pegColours被声明为非空且必须包含3个元素的数组,就会触发“Expecting an element”的错误。这时候可以添加兜底逻辑,确保总能拿到3个元素:
val defaultPairs = listOf( Pair(Color.GRAY, "Gray"), Pair(Color.WHITE, "White"), Pair(Color.BLACK, "Black") ) // 先取前3个,如果不够用默认值补全 val targetPairs = allColours.take(3).let { taken -> if (taken.size < 3) { taken + defaultPairs.take(3 - taken.size) } else { taken } } val pegColours = targetPairs.toTypedArray()
原因3:allColours是可空类型
如果allColours被声明为List<Pair<*, *>>?(可空类型),直接调用take()会因为可能为null而报错。这时候需要先做非空判断,配合 Elvis 运算符处理空情况:
val allColours: List<Pair<Color, String>>? = getColoursFromSomeSource() // 可能返回null val pegColours: Array<Pair<Color, String>> = allColours?.take(3) ?: defaultPairs.toTypedArray()
内容的提问来源于stack exchange,提问作者Dave Chambers
相关产品推荐
相关产品推荐

