Вход внутри scala Опция [T] цепочка вызовов - PullRequest
1 голос
/ 26 марта 2020
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] я работаю on None и сможет продолжить цепочку вызовов после этого.
Есть ли у scala собственная поддержка для этого?

Ответы [ 2 ]

3 голосов
/ 26 марта 2020

Есть два способа (если не больше) об этом go.

Мне нравится метод 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 => if (x.isEmpty) logger.info(...))
       .map(SomeObject)
3 голосов
/ 26 марта 2020

Нет родного пути. Вы, вероятно, можете использовать некоторую библиотеку, но вы также можете написать такой метод расширения самостоятельно, т.е.

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