scala集合具有不同的调用方式

时间:2012-11-03 09:11:28

标签: scala

这个编译

//legal
def s1 = List("aaa","bbb").collect { case x => x.split("\\w") }

以下不要。

// all illegal

// missing parameter type for expanded function ((x$2) => x$2.split{<null>}("\\w"{<null>} {<null>}){<null>}
def s2 = List("aaa","bbb").collect ( _.split("\\w") )

// missing parameter type
def s3 = List("aaa","bbb").collect ( x => x.split("\\w") )

// type mismatch; found : String => Array[java.lang.String] required: PartialFunction[java.lang.String,?]
def s4 = List("aaa","bbb").collect ( (x:String) => x.split("\\w") )

虽然scala编译器正在尽力与我沟通我的错误所在,但它正好在我脑海中。

这也是编译的事实

def s2 = List("aaa","bbb").find ( _.split("\\w").length > 2 )

使用什么

时更加令人困惑

2 个答案:

答案 0 :(得分:7)

第二部分不编译的原因是List#collectPartialFunction[A, B]作为参数,因此可以指定要应用的函数和过滤要应用此函数的元素。

例如:

  

列表(1,“a”,2,“3”)。collect {case x:Int =&gt; x + 1}

将仅应用于整数元素并返回List(2, 3) <{1}} List[Int]

在您的情况下,您可以使用mapfilter函数来完成工作

def s1 = List("aaa","bbb").map(_.split("\\w")).filter(_.length > 2)

答案 1 :(得分:1)

collect需要一个部分函数(一系列case语句):

list.collect {
  case a => ...
  case b => ...
  ...
}