2012-09-22 90 views
39

我试过Google搜索,找不到像样的forall例子。它有什么作用?为什么它需要一个布尔函数?斯卡拉例如?

请指点我参考(斯卡拉多克除外)。

+6

http://www.scala-lang.org/api/current/scala/collection/immutable/List.html:'测试一个谓词是否适用于这个列表的所有元素.' – MikkoP

+1

也许你因为你的想法而感到困惑而不是(重复遍历所有元素) –

+1

是的,我在想它是一个并行版本的foreach。 – Jus12

回答

64

forall方法采用返回布尔值的函数pforall的语义说:return true如果对于集合中的每个xp(x)为true。

所以:

List(1,2,3).forall(x => x < 3) 

指:true如果为1,2和3是小于3,false否则。在这种情况下,将计算为false,因为它不是所有元素都小于3的情况下:3是不小于3

有一个类似的方法exists返回true如果存在至少一个元素x,使p(x)为真。

所以:

List(1,2,3).exists(x => x < 3) 

意味着:true如果 1,2,和3中的至少一个小于3,false否则。在这种情况下,它将评估为true,因为在某些元素小于3的情况下:例如1小于3.

+2

所以'forall(foo)'等于'foldLeft(true)((x,y)=> x&foo(y))' – Jus12

+5

@ Jus12,是的,修正它使用'&&'因为它确实短路评估(如果发现“false”,它会停止评估'foo')。 – dhg

3

一个简单的例子,说明如何使用Scala脚本来玩这个功能。

创建myScript.scala文件,

println(args.forall(p => (p.equals("a")))) 

scala myScript.scala a a a // true 
scala myScript.scala a b c // false 
+4

为什么不使用REPL? –

0

还不错叫它要记住,你的封内就可以执行更多的指令,例如分配了变量的作用域的

def main(args: Array[String]){ 
var country = "" 
var environment = "" 

val isValid = args.sliding(2, 2).forall{ 
    case Array("--env", value : String) => { 
    environment = value 
    Array("test", "staging", "prod").contains(value.toLowerCase()) 
    } 
    case Array("--country", value : String) => { 
    country = value 
    Array("BE", "NL", "FR").contains(value.toLowerCase()) 
    } 
    case _ => false 
} 

if(!isValid){ 
    println ("Wrong usage. Please insert params in the following format: --country {NL,BE,UK,FR} --env {test, staging, prod}") 
    return 
} 
else 
    println (s"Correct usage. env=$environment country=$country") 

}