scala - 使用高阶函数来简洁 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
我不确定这是正确的方法还是有更好的方法?
解决方案
让我们考虑以下场景:
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
推荐阅读
- php - 导入excel文件时如何生成带有特殊id的二维码
- dll - 我可以注入自己的 HID 命令或调用设备的驱动程序吗?
- r - 有没有办法告诉 R 假设您正在从特定数据帧中提取子集?
- swift - 如何使用 Swift 根据 textview 的大小实时扩展 uicollectionviewcell?
- go - 如何切片切片以消除相同切片中的匹配值
- prolog - 在 Prolog 中生成具有自变量的列表
- c++ - CMake“未定义的参考”
- python - 使用 selenium python 切换到新窗口
- spring - Spring批处理文件读取器记录在记录中具有不同的分隔符
- rest - Express REST API 路由器和 Mongoose 模式设计