【问题标题】:How do I get an item in a list that matches a certain condition?如何在列表中获取符合特定条件的项目?
【发布时间】:2015-02-04 19:35:59
【问题描述】:

我有以下示例代码:

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 中,我需要找到一个id 等于参数idTask,如果找到,我需要从集合中删除它并从方法中返回true。否则(如果没有找到)我应该返回 false。

我知道如何使用命令式语言(例如 C# 或 Java)来做到这一点,但 Scala 难倒我……

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

【问题讨论】:

    标签: scala pattern-matching scala-collections predicate


    【解决方案1】:

    这是一种可能的解决方案,但是在这种情况下,我认为也可以切换到 var + immutable ArrayBuffer 并使用过滤器。另请注意,此代码不是线程安全的

      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 -= _map 的参数,是否返回删除的项目?
    • 不,它返回缓冲区本身。但是您可以更新此表达式以返回已删除的项目:map(found => {buffer -= found; found})。
    猜你喜欢
    • 1970-01-01
    • 2012-06-25
    • 2013-02-28
    • 2011-11-22
    • 1970-01-01
    • 1970-01-01
    • 2022-11-13
    • 2022-12-07
    • 2011-11-02
    相关资源
    最近更新 更多