2013-02-11 138 views
9

在scala中是否有方法来获取List或Seq的(单个)头元素和列表的(集合)尾?我知道有从scala列表中获取头项目和尾项目

def splitAt(n: Int): (List[A], List[A]) 

我可以很容易地从元组的第一个列表中抓取单个项目。但是有没有内置的方法基本上是这样的?

def splitAtHead: (Option[A], List[A]) 

就像我说的,你可以很容易地连锁splitAt返回正确的签名,但我想一个内置的方法也许能够节省中间元组。

编辑:

@ OM-NOM-NOM的答案是正确的,但是这就是为什么我不能用他的第二个版本。

List[S](s1, s2, s3, s4).sortBy { _.f (h) } match { 
    case hd :: tail => recurse(tail) 
} 

回答

24

您可以使用模式匹配:

val hd::tail = List(1,2,3,4,5) 
//hd: Int = 1 
//tail: List[Int] = List(2, 3, 4, 5) 

或者只。头/ .tail方法:

val hd = foo.head 
// hd: Int = 1 
val hdOpt = foo.headOption 
// hd: Option[Int] = Some(1) 
val tl = foo.tail 
// tl: List[Int] = List(2, 3, 4) 
+0

啊,模式匹配,效果显着。出于某种原因,我认为'case hd :: tail'会失败的单个元素列表。但我只是测试它,它运行良好。我会编辑我的问题,回答为什么我不能使用你的第二个版本。 – Falmarri 2013-02-11 00:15:57