Scala 如何在列表中获取符合特定条件的项?

Scala 如何在列表中获取符合特定条件的项?,scala,pattern-matching,scala-collections,predicate,Scala,Pattern Matching,Scala Collections,Predicate,我有以下示例代码: 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 = n

我有以下示例代码:

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

  }
}
在方法
delete
中,我需要找到一个
Task
,该任务的
id
等于参数
id
,如果找到了,我需要将其从集合中删除,并从方法中返回true。否则(如果没有找到),我应该返回false

我知道如何在命令式语言(如C#或Java)中实现这一点,但Scala让我感到困惑


PS:代码被严格用于理解语言和平台,在生产中被推送太多了。别担心。

这是一种可能的解决方案,但是在这种情况下,我认为也可以切换到var+不可变数组缓冲并使用filter。还要注意,此代码不是线程安全的

  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)}")

看起来真不错!(如面向函数的,如果我可以这么说的话)我最终发现了
find
,但我不知道
map
,它可以这样使用:)一个问题,如果可以的话:表达式
buffer-=\ucode>,它是
map
的参数,是否返回删除的项?不,它返回buffer本身。但您可以更新此表达式以返回删除的项:map(found=>{buffer-=found;found})。