使用高阶函数简明scala代码

问题描述 投票:0回答:2

我是Scala的新手,正在尝试编写一些程序以使其变得更好。我编写了一个非常类似于Java的流(版本1),并且我试图使用高阶函数(版本2)来编写它。版本1:

    val entry: Option[Int] = getEntry()

    if (entry.isDefined) {
      val cachedEntry = entry.get
      if (entry.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

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

scala functional-programming higher-order-functions
2个回答
0
投票

为了清楚起见,我更喜欢使用match

getEntry() match {
  case Some(entry) if entry.state.isActive => entry
  case opt => opt.foreach(Cache.invalidateCachedEntry); Cache.createNewEntry()
}

0
投票

让我们考虑以下场景:

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

© www.soinside.com 2019 - 2024. All rights reserved.