2014-12-06 2 views
0

У меня есть следующий код:Как получить элемент в списке, который соответствует определенному условию?

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 и если кто-то обнаружил, что мне нужно, чтобы удалить его из коллекции и возвращает истину от метод. В противном случае (если ни один не найден) я должен просто вернуть false.

Я знаю, как это сделать в императивном языке, как C# или Java, но Scala пни меня ..

PS: Код используется исключительно для понимания языка и платформы, она сосет слишком много, чтобы быть толкается в производство. Не волнуйся.

ответ

2

Это одно из возможных решений, однако в этом случае я думаю, что также можно переключиться на 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)}") 
+0

выглядит действительно хорошо! (как в функционально-ориентированном, если можно так сказать) –

+0

В конце концов я обнаружил 'find', но я не знал о' map' и что его можно использовать так :) –

+0

Один вопрос, если я могу: делает ли выражение 'buffer - = _', который является аргументом' map', возвращает удаленный элемент? –

Смежные вопросы