集合式函数(如map和filter)会及早地创建中间集合,即每一步的中间结果都被存储在一个临时列表。序列可以避免创建这些临时中间对象。
people.map(Person::name).filter { it.startsWith("A") }
改为序列:people.asSequence() //集合转为序列
.map(Person::name).filter { it.startsWith("A") }
.toList() //序列转为列表
Kotlin惰性集合操作的入口就是Sequence接口。这个接口表示的就是一个可以逐个列举元素的元素序列。Sequence只提供了一个方法,iterator,用来从序列中获取值。
1.1、执行序列操作:中间和末端操作
一次中间操作返回的是另一个序列,这个新序列知道如何变换原始序列中的元素。
一次末端操作返回的是一个结果(可能为集合、元素、数字...)
people.asSequence() .map(Person::name).filter { it.startsWith("A") } .toList()
|------------中间操作----------------------------------|---末端操作---|
中间操作始终是惰性的。没有末端操作意味着map和filter变换被延期了,末端操作出发了所有的延期计算。
1.2、创建序列
创建序列有两种方法:1、asSequence()。2、使用generateSequence()。
val naturalNumbers=generateSequence(0){it +1}
val numbersTo100= naturalNumbers.takeWhile{ it <= 100 } //100以内的自然数序列
naturalNumbers和numbersTo100都是有延期操作的序列。序列中的实际数字直到你调用末端操作的时候才会求值。
fun File.isInsideHiddenDirectory() = generateSequence(this) { it.parentFile }.any{ it. isHidden }
val file = File (" /Users/svtk/.HiddenDir/a.txt")
file.isInsideHiddenDirectory() //查询文件是否放在隐藏目录中。