惰性集合操作:序列

集合式函数(如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()  //查询文件是否放在隐藏目录中。

你可能感兴趣的:(惰性集合操作:序列)