使用范围的稀疏值列表

sparse list of values using ranges

有没有更简洁的写法

listOf('a'..'z','A'..'Z').flatMap { it }

这里的想法是迭代一个范围内的一些值,比如从 1 到 100 的数字,跳过 21 到 24

listOf(1..20, 25..100).flatMap { it }

您可以使用 flatten() instead of flatMap():

来稍微缩短列表
listOf('a'..'z','A'..'Z').flatten()

或更短的形式(来自@Ilya)是使用 plus() + operator of Iterable 范围实现 的接口)。每个 + 将复制列表:

val validLetters = ('a'..'z') + ('A'..'Z')
val someNumbers = (1..20) + (25..100)

或者像 Sequence 一样变得更懒惰(不确定这里是否更懒惰):

sequenceOf('a'..'z','A'..'Z').flatten()

##作为辅助函数##

在 Kotlin 中,人们通常会创建一个辅助函数来很好地包装这样的东西;如果你碰巧re-use这个代码很多:

// helper functions
fun sparseListOf(vararg ranges: CharRange): List<Char> = ranges.flatMap { it }       
fun sparseListOf(vararg ranges: IntRange): List<Int> = ranges.flatMap { it }

...以及这些助手的用法:

val validLetters = sparseListOf('a'..'z', 'A'..'Z')
val someNumbers = spareListOf(1..20, 25..100)

注意: 辅助函数使用 flatMap() 因为没有 flatten() Array<out XYZ> 的方法或扩展,它是从 vararg 接收到的类型。 lambda 是内联的,因此在性能上可能没有真正的区别。

kotlin.Char.rangeTo returns 一个 CharRangeCharProgression 的一个实现。 CharProgression 是 Iterable 的子类,加号运算符定义在可迭代对象上:Iterable<T>.plus

产生一个非常简单的外观

('a'..'z') + ('A'..'Z')