case class SomeObject(value: Int)
val start : List[Int] = List(1,2,3,5,6)
def findfour(start : List[Int]) : Option[SomeObject] = {
start.find(_ equals 4)
//.isNone(logger.info("Couldnt find a four!")). <--- native way to do this?
.map(SomeObject(_))
}
我有一个现有的呼叫链(比示例更强大,但场景相同),我想在呼叫链中添加一个呼叫,以记录我正在处理的Option [Int]是否为None并在此之后能够继续呼叫链。scala是否对此有本地支持?
没有本地方法。您可能可以使用某些库,但也可以自己编写此类扩展方法,即
implicit class OrNone[A](fa: Option[A]) {
def isNone(log: => Unit): Option[A] = {
if (fa.isEmpty) log
fa
}
}
有两种方法(如果没有更多的话)。
我喜欢fold()
方法,但是您必须重新包装Option
。
def findfour(start : List[Int]) : Option[SomeObject] = {
start.find(_ equals 4)
.fold{logger.info(...)
Option.empty[SomeObject] //re-create the None
}(x =>Some(SomeObject(x)))
}
或者,如果您使用的是Scala 2.13.x,则新的链接方法可能会更清晰一些。
import scala.util.chaining._
def findfour(start : List[Int]) : Option[SomeObject] = {
start.find(_ equals 4)
.tap{x => logger.info(...); x}
.map(SomeObject)
}