scala - Удалять при чтении - PullRequest
       11

scala - Удалять при чтении

0 голосов
/ 03 августа 2020

Может ли кто-нибудь предложить эффективный и лаконичный способ реализации следующей функции «удалять при чтении»? То есть при чтении атрибута _events он очищается.

case class Event(nanos: Long)

case class History() {
  private val _events = ArrayBuffer[Event]()
  def add(event: Event): Unit = _events += event
  
  def events: List[Event] = {
    val builder = ArrayBuffer[Event]()
    builder ++= _events
    _events.clear()
    builder.toList 
  }
}

Ответы [ 2 ]

3 голосов
/ 03 августа 2020

Предполагая, что вы не выполняете параллелизм. Вам не нужно создавать новый ArrayBuffer. toList создает новый неизменяемый список, который сохранится, когда вы очистите. Просто сделайте

def events: List[Event] = {
  val res = _events.toList
  _events.clear()
  res
}
1 голос
/ 04 августа 2020

Вы можете использовать ConcurrentLinkedQueue из Java. Следующее решение поддерживает параллелизм таким образом, что если вы добавляете объекты при извлечении истории, они будут добавлены в историю и в результат текущего вызова. Однако в этом решении они читаются один раз. Если вам нужно прекратить добавление во время получения истории, мы можем подумать о другом решении. Рассмотрите возможность использования класса History следующим образом:

case class History() {
  private val _events = new ConcurrentLinkedQueue[Event]()
  def add(event: Event): Unit = _events.add(event)

  def events: List[Event] = {
    if (_events.isEmpty) {
      List()
    } else {
      _events.poll() +: events
    }
  }
}

Затем, при выполнении следующего кода:

def main(args: Array[String]): Unit = {
  val h = History()
  List(
    Event(10),
    Event(20),
    Event(30)
  ).foreach(h.add)

  println(s"Events are: ${h.events.mkString(", ")}")
  println(s"Events are: ${h.events.mkString(", ")}")
}

Результат:

Events are: Event(10), Event(20), Event(30)
Events are: 

Process finished with exit code 0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...