谓词不会返回任何带有跨度的东西

时间:2014-05-25 15:31:55

标签: scala

我使用以下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())

任何人都可以向我解释发生了什么吗?

非常感谢

2 个答案:

答案 0 :(得分:2)

spantakeWhile类似,不同之处在于它从第一个失败的匹配开始返回列表的其余部分。由于您的谓词在列表的第一个元素上失败,您将获得您所看到的结果。

如果您想要通过/不通过谓词的所有元素,您可以使用partition代替:

list partition ( _.length > 1)

如果您只需要传递谓词的元素,则可以使用filter

list filter ( _.length > 1)

答案 1 :(得分:2)

您似乎对spanpartition

感到困惑
  • partition根据谓词p
  • 将列表拆分为2
  • 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))