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