Andrei Rînea
Andrei Rînea

Reputation: 20780

How do I get an item in a list that matches a certain condition?

I have the following sample code :

package models

import java.util.concurrent.atomic.AtomicInteger
import scala.collection.mutable.ArrayBuffer

case class Task(id: Int, label: String)

object Task {

  private val buffer = new ArrayBuffer[Task]
  private val incrementer = new AtomicInteger()

  def all(): List[Task] = buffer.toList

  def create(label: String): Int = {
    val newId = incrementer.incrementAndGet()
    buffer += new Task(newId, label)
    newId
  }

  def delete(id: Int): Boolean = {

    // TODO : add code

  }
}

In method delete I need to find a Task that has id equal to the parameter id and if one is found I need to remove it from the collection and return true from the method. Otherwise (if none is found) I should just return false.

I know how to do this in an imperative language such as C# or Java but Scala stumps me..

PS : The code is strictly used to understand the language and the platform, it sucks too much to be pushed in production. Don't worry.

Upvotes: 0

Views: 101

Answers (1)

Eugene Zhulenev
Eugene Zhulenev

Reputation: 9734

This is one possible solution, however in this case I think it's also possible to switch to var + immutable ArrayBuffer and use filter. Also note that this code is not thread safe

  import java.util.concurrent.atomic.AtomicInteger
  import scala.collection.mutable.ArrayBuffer

  case class Task(id: Int, label: String)

  object Task {

    private val buffer = new ArrayBuffer[Task]
    private val incrementer = new AtomicInteger()

    def all(): List[Task] = buffer.toList

    def create(label: String): Int = {
      val newId = incrementer.incrementAndGet()
      buffer.append(Task(newId, label))
      newId
    }

    def delete(id: Int): Boolean = {
      buffer.
        find(_.id == id). // find task by id
        map(buffer -= _). // remove it from buffer
        exists(_ => true) // the same as: map(_ => true).getOrElse(false) 
    }
  }

  val id1 = Task.create("aaa")
  val id2 = Task.create("bbb")

  println(s"Id1 = $id1 Id2 = $id2")
  println(s"All = ${Task.all()}")

  val deleted = Task.delete(id1)
  println(s"Deleted = $deleted")
  println(s"All = ${Task.all()}")


  println(s"Not Deleted = ${Task.delete(123)}")

Upvotes: 2

Related Questions