使用范围的稀疏值列表
有没有更简洁的写作方式?
listOf('a'..'z','A'..'Z').flatMap { it }
这里的想法是遍历一个范围内的一些值,如从1到100的数字,跳过21到24
listOf(1..20, 25..100).flatMap { it }
你可以通过使用flatten()
而不是flatMap()
来稍微缩短列表的长度:
listOf('a'..'z','A'..'Z').flatten()
或更短的形式(来自@Ilya)是使用Iterable
的plus()
+
运算符 ( 一个范围实现的接口 )。 每个+
都会制作一份清单的副本:
val validLetters = ('a'..'z') + ('A'..'Z') val someNumbers = (1..20) + (25..100)
或者更懒惰地作为一个Sequence
(不确定这里的事情是否更重要)。
sequenceOf('a'..'z','A'..'Z').flatten()
作为帮助函数
在Kotlin中,人们通常会创建一个辅助函数来很好地包装这样的东西; 如果你碰巧重复使用这个代码很多:
// 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
收到的类型。 拉姆达内联很可能没有真正的性能差异。
kotlin.Char.rangeTo
返回一个CharRange
实现的CharProgression
。 CharProgression是Iterable
一个子类,plus运算符是在iterables上定义的: Iterable<T>.plus
看起来很简单,很明显
('a'..'z') + ('A'..'Z')