【发布时间】:2017-02-11 20:43:01
【问题描述】:
我对 Scala 中的惰性求值有一些疑问。 这是示例代码:
val people=List(("Mark", 32), ("Bob", 22), ("Jane", 8),
("Jill", 21), ("nick", 50), ("Nancy", 42),
("Mike", 19), ("Sara", 12), ("Paula", 42),
("John", 21))
def isOlderThan17(person: (String,Int)) = {
println(s"isOlderThan 17 called for $person")
val(_,age) = person
age > 17
}
def nameStartsWithJ(person: (String, Int)) = {
println(s"isNameStartsWithJ called for $person")
val (name,_) = person
name.startsWith("J")
}
println(people.view.filter(p => isOlderThan17(p))
.filter(p => nameStartsWithJ(p))
.last)
输出:
isOlderThan 17 called for (Mark,32)
isNameStartsWithJ called for (Mark,32)
isOlderThan 17 called for (Bob,22)
isNameStartsWithJ called for (Bob,22)
isOlderThan 17 called for (Jane,8)
isOlderThan 17 called for (Jill,21)
isNameStartsWithJ called for (Jill,21)
isOlderThan 17 called for (Mark,32) //Here is the problem.
isNameStartsWithJ called for (Mark,32)
isOlderThan 17 called for (Bob,22)
isNameStartsWithJ called for (Bob,22)
isOlderThan 17 called for (Jane,8)
isOlderThan 17 called for (Jill,21)
isNameStartsWithJ called for (Jill,21)
isOlderThan 17 called for (nick,50)
isNameStartsWithJ called for (nick,50)
isOlderThan 17 called for (Nancy,42)
isNameStartsWithJ called for (Nancy,42)
isOlderThan 17 called for (Mike,19)
isNameStartsWithJ called for (Mike,19)
isOlderThan 17 called for (Sara,12)
isOlderThan 17 called for (Paula,42)
isNameStartsWithJ called for (Paula,42)
isOlderThan 17 called for (John,21)
isNameStartsWithJ called for (John,21)
(John,21)
为什么在找到“Jill”之后必须重新开始评估(再次从“Mark”返回)?为什么不继续评估直到列表结束?
【问题讨论】:
标签: list scala collections filter lazy-evaluation