Используйте функции высшего порядка для краткого кода scala - PullRequest
0 голосов
/ 08 апреля 2020

Я новичок в Scala и пытаюсь написать несколько программ, чтобы улучшить его. Я написал поток (версия 1), очень похожий на Java, и я пытаюсь написать его, используя функции более высокого порядка (версия 2).

версия 1:

    val entry: Option[Int] = getEntry()

    if (entry.isDefined) {
      val cachedEntry = entry.get
      if (cachedEntry.state.isActive) {
        return cachedEntry
      } else {
        Cache.invalidateCachedEntry(cachedEntry)
      }
    }

    Cache.createNewEntry()

версия 2:

    val entry: Option[Int] = getEntry()

    entry.filter(_.state.isActive).orElse((() => {
      Cache.invalidateCachedEntry _
      Option(Cache.createNewEntry())
    })()).get

Я не уверен, что это правильный подход или есть лучший способ сделать это?

Ответы [ 2 ]

3 голосов
/ 08 апреля 2020

Давайте рассмотрим следующий сценарий:

case class Entry(state: AnyState)
case class AnyState(isActive: Boolean = true)

object Cache {
  def invalidateCachedEntry(entry: Entry): Unit = println("cleaned")
}

def getEntry: Option[Entry] = Some(Entry(AnyState()))

val optEntry: Option[Entry] = getEntry

val result: Option[Entry] = optEntry match {
  case Some(entry) if entry.state.isActive =>
    entry // do something
     println("did something")
     Some(entry)
  case Some(entry) =>
    Cache.invalidateCachedEntry(entry)
    None
  case _ =>
   println("Entry not found")
   None
}


Это будет один сценарий. В общем, вы должны что-то вернуть. Но иногда вам не хватает информации. В таких случаях вы можете вернуть Option и если вы хотите выдать ошибку, вы можете использовать либо

1 голос
/ 08 апреля 2020

Я предпочитаю использовать match для ясности:

getEntry() match {
  case Some(entry) if entry.state.isActive => entry
  case opt => opt.foreach(Cache.invalidateCachedEntry); Cache.createNewEntry()
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...