我使用以下here
列表完成了一些测试如果我尝试使用span
对列表中少于N个字符的项目进行分组,则会返回一个空列表
scala> val list = List("I", "'d", "like", "to fix", "this", "sentence", "because", "it", "'s", "broken")
list: List[String] = List(I, 'd, like, to fix, this, sentence, because, it, 's, broken)
scala> list span ( _.length > 1) // The predicate doesnt match anything: Empty list
res36: (List[String], List[String]) = (List(),List(I, 'd, like, to fix, this, sentence, because, it, 's, broken))
scala> list map ( _.length)
res37: List[Int] = List(1, 2, 4, 6, 4, 8, 7, 2, 2, 6)
scala> val list = List("Hello","World","Foo","Bar","Donald", "Duck")
list: List[String] = List(Hello, World, Foo, Bar, Donald, Duck)
scala> list span ( _.length > 1)
res38: (List[String], List[String]) = (List(Hello, World, Foo, Bar, Donald, Duck),List())
任何人都可以向我解释发生了什么吗?
非常感谢
答案 0 :(得分:2)
span
与takeWhile
类似,不同之处在于它从第一个失败的匹配开始返回列表的其余部分。由于您的谓词在列表的第一个元素上失败,您将获得您所看到的结果。
如果您想要通过/不通过谓词的所有元素,您可以使用partition
代替:
list partition ( _.length > 1)
如果您只需要传递谓词的元素,则可以使用filter
:
list filter ( _.length > 1)
答案 1 :(得分:2)
您似乎对span
和partition
:
partition
根据谓词p
span
将列表拆分为两部分:(直到p
为假,列表的其余部分)来自文档:Note: c span p is equivalent to (but possibly more efficient than) (c takeWhile p, c dropWhile p)
此处谓词(_.length > 1)
在第一个元素上失败,因此span
返回(List(),List(I, 'd, like, to fix, this, sentence, because, it, 's, broken))