使用范围的稀疏值列表

有没有更简洁的写作方式?

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)是使用Iterableplus() +运算符 ( 一个范围实现的接口 )。 每个+都会制作一份清单的副本:

 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')