使用范围的稀疏值列表

act*_*cay 11 kotlin

是否有更简洁的写作方式

listOf('a'..'z','A'..'Z').flatMap { it }
Run Code Online (Sandbox Code Playgroud)

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

listOf(1..20, 25..100).flatMap { it }
Run Code Online (Sandbox Code Playgroud)

Jay*_*ard 21

您可以通过使用去列表稍短flatten(),而不是flatMap():

listOf('a'..'z','A'..'Z').flatten()
Run Code Online (Sandbox Code Playgroud)

或较短的形式(从@Ilya)是使用plus() +操作者Iterable(即范围实现接口).每个人+都会复制一份清单:

val validLetters = ('a'..'z') + ('A'..'Z')
val someNumbers = (1..20) + (25..100)
Run Code Online (Sandbox Code Playgroud)

或者更加懒惰Sequence(不确定在这里是否更加懒散):

sequenceOf('a'..'z','A'..'Z').flatten()
Run Code Online (Sandbox Code Playgroud)

作为助手功能

在Kotlin,人们通常会创建一个辅助函数来很好地包装这样的东西; 如果你碰巧重复使用这段代码:

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

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

val validLetters = sparseListOf('a'..'z', 'A'..'Z')
val someNumbers = spareListOf(1..20, 25..100)
Run Code Online (Sandbox Code Playgroud)

注意: 辅助函数使用,flatMap()因为没有flatten()方法或扩展名,Array<out XYZ>从中接收的类型vararg.lambda内联很可能没有真正的性能差异.

  • 对于急切的评估,有一个更短的选择:`('a'..'z')+('A'..'Z')` (5认同)