首页 > 解决方案 > 使用高阶函数来简洁 scala 代码

问题描述

我是 Scala 的新手,正在尝试编写一些程序以使其变得更好。我编写了一个非常类似于 Java 的流程(版本 1),我正在尝试使用高阶函数(版本 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

我不确定这是正确的方法还是有更好的方法?

标签: scalafunctional-programminghigher-order-functions

解决方案


让我们考虑以下场景:

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,如果你想抛出错误,你可以使用 Either


推荐阅读