使用高阶函数来简洁scala代码
Use higher order functions to concise scala code
我是 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
我不确定这是正确的方法还是有更好的方法?
为了清楚起见,我更喜欢使用match
:
getEntry() match {
case Some(entry) if entry.state.isActive => entry
case opt => opt.foreach(Cache.invalidateCachedEntry); Cache.createNewEntry()
}
让我们考虑以下场景:
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
}
这是一个场景。一般来说,你应该 return 一些东西。但有时你没有足够的信息。这种情况下你可以 return Option
如果你想抛出一个错误你可以使用 Either
我是 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
我不确定这是正确的方法还是有更好的方法?
为了清楚起见,我更喜欢使用match
:
getEntry() match {
case Some(entry) if entry.state.isActive => entry
case opt => opt.foreach(Cache.invalidateCachedEntry); Cache.createNewEntry()
}
让我们考虑以下场景:
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
}
这是一个场景。一般来说,你应该 return 一些东西。但有时你没有足够的信息。这种情况下你可以 return Option
如果你想抛出一个错误你可以使用 Either