在Scala中有条件地删除第一个元素?

ash*_*ley 2 scala scala-collections

如果它是零,则尝试删除列表的第一个元素(不是真的,但是出于示例的目的).

给出一个清单:

val ns = List(0, 1, 2)
Run Code Online (Sandbox Code Playgroud)

删除第一个零可以通过将第一个匹配项删除为零来完成:

List(0, 1, 2).dropWhile(_ == 0)
res1: List[Int] = List(1, 2)
Run Code Online (Sandbox Code Playgroud)

或者你可以删除所有不为零的东西.

List(0, 1, 2).filter(_ > 0)
res2: List[Int] = List(1, 2)
Run Code Online (Sandbox Code Playgroud)

这些问题是当列表有多个零时.以前的解决方案不起作用,因为它们删除了太多的零:

List(0, 0, 1, 2, 0).filter(_ > 0)
res3: List[Int] = List(1, 2)

List(0, 0, 1, 2, 0).dropWhile(_ == 0)
res4: List[Int] = List(1, 2, 0)
Run Code Online (Sandbox Code Playgroud)

这有现成的功能吗?

PH8*_*H88 6

我还认为模式匹配是可读性和性能的最佳选择(我测试过,OP的模式匹配代码实际上比简单更好if ... else ....).

List(0, 0, 1, 2, 0) match { 
  case 0 :: xs => xs 
  case xs => xs
}
res10: List[Int] = List(0, 1, 2, 0)
Run Code Online (Sandbox Code Playgroud)

而且,不,没有简单的内置功能.