К сожалению, иерархия коллекций оказалась в беспорядке с -
на List
.Для ArrayBuffer
это работает так, как вы могли бы надеяться:
scala> collection.mutable.ArrayBuffer(1,2,3,2,4) - 2
res0: scala.collection.mutable.ArrayBuffer[Int] = ArrayBuffer(1, 3, 2, 4)
, но, к сожалению, List
в итоге получил реализацию в стиле filterNot
и, таким образом, делает "неправильную вещь" и выдает предупреждение об устаревании (достаточно разумно, поскольку оно на самом деле filterNot
ing):
scala> List(1,2,3,2,4) - 2
warning: there were deprecation warnings; re-run with -deprecation for details
res1: List[Int] = List(1, 3, 4)
Поэтому, возможно, проще всего сделать преобразование List
в коллекцию, которая это делаетправильно, а затем снова конвертируйте:
import collection.mutable.ArrayBuffer._
scala> ((ArrayBuffer() ++ List(1,2,3,2,4)) - 2).toList
res2: List[Int] = List(1, 3, 2, 4)
В качестве альтернативы вы можете сохранить логику кода, который вы получили, но сделать стиль более идиоматическим:
def removeInt(i: Int, li: List[Int]) = {
def removeOne(i: Int, left: List[Int], right: List[Int]): List[Int] = right match {
case r :: rest =>
if (r == i) left.reverse ::: rest
else removeOne(i, r :: left, rest)
case Nil => left.reverse
}
removeOne(i, Nil, li)
}
scala> removeInt(2, List(1,2,3,2,4))
res3: List[Int] = List(1, 3, 2, 4)