【问题标题】:Use higher order functions to concise scala code使用高阶函数来简洁 scala 代码
【发布时间】:2020-04-08 03:53:27
【问题描述】:

我是 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

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

【问题讨论】:

  • 你能把getEntryResponse的结构贴出来吗?其他你的解释是错误的。因为,在上面你定义 entry 是可选的 Int,但后来你 cal .state.isActive
  • 两者看起来不太一样。如果entryNone,那么V1 确实调用Cache.invalidateCachedEntry(),但在V2 中它确实
  • 最后你需要返回什么结果?
  • @Bob 1) 这是一个错字,应该是cachedEntry.state.isActive。我已经更新了这个问题。 2)我需要返回一个整数值(由createNewEntry()返回,不是可选值)
  • @jwvh 你是对的,那是不同的。虽然invalidateCachedEntry 只是从地图中删除了cachedEntry,所以无论哪种方式都应该没问题(应该只是无操作)。

标签: scala functional-programming higher-order-functions


【解决方案1】:

让我们考虑以下场景:

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-02-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多