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

scala – 未来[选项[布尔]]用于理解..简单对吧?

发布时间:2020-12-16 09:02:51 所属栏目:安全 来源:网络整理
导读:假设我有: val res:Future[Option[Boolean]] = Future(Some(true)) 我能做到: res.map(opt = opt.map(r = print(!r))) 我想对此的理解是: for { opt - res r - opt} yield (print(!r)) 但这不起作用!我收到一个错误,即: error: type mismatch;found : O
假设我有:

val res:Future[Option[Boolean]] = Future(Some(true))

我能做到:

res.map(opt => opt.map(r => print(!r)))

我想对此的理解是:

for {
   opt <- res
   r <- opt
} yield (print(!r))

但这不起作用!我收到一个错误,即:

error: type mismatch;
found   : Option[Unit]
required: scala.concurrent.Future[?]
r <- opt

如何在for comprehension中使用Future [Option [Boolean]]来提取或转换布尔值?

注意:这是我目前使用许多Future [Option [Boolean]]变量的问题的简化,我想在for comprehension中一起使用.

解决方法

一个for-comprehension真的让它看起来应该都可以工作,不是吗?但是让我们考虑一下你的要求.

首先,请注意,对于un-nests:

for {xs <- List(List(5)); x <- xs} yield x

产生

List(5)

现在,我们甚至没有进入类型签名或desugaring,我们可以考虑用一些任意类型T替换List,我们将调用包含的类型A:

for { xs <- T(T(a: A)); x <- xs } yield x

我们应该得到一个

T[A]

回来(可能是我们放入的那个,但类型实际上并没有向我们承诺).

好的,但是呢

for { xs <- T(U(a: A)); x <- xs } yield x

?这比两个具有相同嵌套的情况更为一般.好吧,如果T和U都有一个共同的超类型S,那么我们只能将整个事物视为S(S(a:A)),所以我们至少会得到一个S.但是在一般情况下呢?

底线是它取决于.例如,让我们考虑T = Future,U = Option的情况.我们有以下可能性:

Success(Some(a))
Success(None)
Failure(t: Throwable)

现在,我们能否提出任何连贯的解缠政策?如果我们展开未来,那么你用什么A来成功(无)案例?您没有可用的返回.同样地,如果你试图征服外部的未来,你怎么知道,如果没有明确地以某种方式向编译器说明,应该将失败映射到无(如果确实应该 – 也许它应该是默认的!).

所以最重要的是,你不能正确地做到这一点,而不指定每对T [U [_]]应该发生什么. (我鼓励有兴趣的读者仔细阅读monads和monad transformers的教程.)

但是有一条出路:如果你可以明确地将你的U变成T,或者将你的T变成你的U,你可以利用展开功能.将选项转换为未来非常容易,因此最简单的解决方案是

for { opt <- res; r <- Future(opt.get) } yield r

(只是让异常在none.get上抛出).或者,您可以将Future变成一个稍微丑陋的选项

for { opt <- res.value.flatMap(_.toOption); r <- opt } yield r

(编辑:李大同)

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

    推荐文章
      热点阅读