使用范围的稀疏值列表
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 一个 CharRange
即 CharProgression
的一个实现。 CharProgression 是 Iterable
的子类,加号运算符定义在可迭代对象上:Iterable<T>.plus
产生一个非常简单的外观
('a'..'z') + ('A'..'Z')
有没有更简洁的写法
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 一个 CharRange
即 CharProgression
的一个实现。 CharProgression 是 Iterable
的子类,加号运算符定义在可迭代对象上:Iterable<T>.plus
产生一个非常简单的外观
('a'..'z') + ('A'..'Z')