3

这编译

//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 )

什么时候使用什么让事情变得更加混乱

4

2 回答 2

7

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

例如:

List(1, "a", 2, "3").collect {case x : Int => x + 1 }

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

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

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

于 2012-11-03T09:23:41.480 回答
1

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

list.collect {
  case a => ...
  case b => ...
  ...
}
于 2012-11-03T09:23:46.987 回答