加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

链接scala尝试包含选项的实例

发布时间:2020-12-16 09:49:28 所属栏目:安全 来源:网络整理
导读:我试图找到一种更清晰的方式来表达看起来类似于此的代码: def method1: Try[Option[String]] = ???def method2: Try[Option[String]] = ???def method3: Try[Option[String]] = ???method1 match{ case f: Failure[Option[String]] = f case Success(None)
我试图找到一种更清晰的方式来表达看起来类似于此的代码:

def method1: Try[Option[String]] = ???
def method2: Try[Option[String]] = ???
def method3: Try[Option[String]] = ???

method1 match
{
  case f: Failure[Option[String]] => f
  case Success(None) =>
  method2 match
    {
      case f:Failure[Option[String]] => f
      case Success(None) =>
      {
        method3
      }
      case s: Success[Option[String]] => s
    }
  case s: Success[Option[String]] => s
}

如您所见,这将按顺序尝试每个方法,如果一个方法失败,则执行停止,基本匹配将解决该失败.如果method1或method2成功但包含None,则尝试序列中的下一个方法.如果执行到达method3,则无论成功或失败,都会返回其结果.这在代码中运行良好,但我发现很难跟踪发生的事情.

我很乐意用它来理解

for
{
  attempt1 <- method1
  attempt2 <- method2
  attempt3 <- method3
}
  yield
{
  List(attempt1,attempt2,attempt3).find(_.isDefined)
}

因为它的美丽和它的作用是非常清楚的.但是,如果所有方法都成功,那么无论先前的方法是否返回可用的答案,它们都会每次执行.不幸的是我不能那样做.

任何建议,将不胜感激.

解决方法

斯卡拉兹在这里可以提供帮助.你需要scalaz-contrib为Try添加一个monad实例,然后你可以使用具有漂亮组合器的OptionT.这是一个例子:

import scalaz.OptionT
import scalaz.contrib.std.utilTry._
import scala.util.Try

def method1: OptionT[Try,String] = OptionT(Try(Some("method1")))
def method2: OptionT[Try,String] = OptionT(Try(Some("method2")))
def method3: OptionT[Try,String] = { println("method 3 is never called") ; OptionT(Try(Some("method3"))) }
def method4: OptionT[Try,String] = OptionT(Try(None))
def method5: OptionT[Try,String] = OptionT(Try(throw new Exception("fail")))

println((method1 orElse method2 orElse method3).run) // Success(Some(method1))
println((method4 orElse method2 orElse method3).run) // Success(Some(method2))
println((method5 orElse method2 orElse method3).run) // Failure(java.lang.Exception: fail)

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读