What is the best way to remove the first occurrence of an object from a list in Scala?
Starting in Java, I'm used to having a List.remove(Object o) method that removes the first occurrence of an item from a list. Now that I am working in Scala, I expect the method to return a new immutable List instead of mutating the given list. I can also expect the remove() method to use a predicate instead of an object. Taken together, I would expect to find a method like this:
def removeFirst(toRemove: E => Boolean): List[E]
Of course, I can implement this method for myself in several different ways, but none of them jumps at me, as the fact that it is obviously the best. I would prefer not to convert my list to a Java list (or even to a Scala variable list) and vice versa, although this will certainly work. I could use List.indexWhere(p: (A) ⇒ Boolean) :
def removeFirst[E](list: List[E], toRemove: (E) => Boolean): List[E] = { val i = list.indexWhere(toRemove) if (i == -1) list else list.slice(0, i) ++ list.slice(i+1, list.size) }
However, using indexes with linked lists is usually not the most efficient way.
I can write a more efficient method:
def removeFirst[T](list: List[T], toRemove: (T) => Boolean): List[T] = { def search(toProcess: List[T], processed: List[T]): List[T] = toProcess match { case Nil => list case head :: tail => if (toRemove(head)) processed.reverse ++ tail else search(tail, head :: processed) } search(list, Nil) }
However, this is not entirely concise. It seems strange that there is no existing method that would allow me to do this efficiently and concisely. So, am I missing something, or is my last solution really as good as it gets?