在scala选项内登录[T]调用链

问题描述 投票:0回答:2
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是否对此有本地支持?

scala optional
2个回答
1
投票

没有本地方法。您可能可以使用某些库,但也可以自己编写此类扩展方法,即

implicit class OrNone[A](fa: Option[A]) {
  def isNone(log: => Unit): Option[A] = {
    if (fa.isEmpty) log
    fa
  }
}

0
投票

有两种方法(如果没有更多的话)。

我喜欢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)
}
© www.soinside.com 2019 - 2024. All rights reserved.