2012-11-03 33 views
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) 

使得这一切更加混乱时使用何种

回答

7

为什么第二部分不能编译的原因是List#collect需要PartialFunction[A, B]作为PARAM所以这是事实可以指定函数来应用和过滤要应用此函数的元素。

,例如:

列表(1, “A”,2 “3”)收集{情况下,x:INT => X + 1}

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

你的情况,你可以使用mapfilter功能做的工作

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

+1

好了,所以它实际上是一个特例,因为它具有比像找到一个方法不同的签名。我可以忍受这一点,谢谢 – npiv

1

收集期望的部分功能(系列case语句):

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