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

在Scala中嵌套Seqs中是否存在一种简单的默认方式?

发布时间:2020-12-16 08:52:59 所属栏目:安全 来源:网络整理
导读:我有一个矢量矢量,我正在访问以应用布尔函数.即 矢量[Vector [T]]我将要执行的内容 f(myVector(i)(j))其中f是T =类型.布尔. 但是这不会做边界检查,我不能得到一些非常优雅的东西. 我可以使用applyOrElse: myVector.applyOrElse(i,(_:Int)= Vector.empty).a
我有一个矢量矢量,我正在访问以应用布尔函数.即

矢量[Vector [T]]我将要执行的内容
f(myVector(i)(j))其中f是T =>类型.布尔.

但是这不会做边界检查,我不能得到一些非常优雅的东西.

我可以使用applyOrElse:
myVector.applyOrElse(i,(_:Int)=> Vector.empty).applyOrElse(j,(_:Int)=> defaultT)

其中f(defaultT)将返回false
但我希望我可以设置默认值而不是函数.

我可以使用电梯给我一个选项,但它在第二级不能很好地构成:
myVector.lift(i)map(_.lift(j)map f getOrElse false)getOrElse false

哪个确实有效,但仍然很难阅读.

然后是标准的if / else块:

if (myVector.size <= i) false
else {
  val myVector2 = levelVector(i)
  if (myVector2.size <= j) false
  else f(myVector2(j))
}

它似乎应该能够比我能够实现的更容易分解.如果我添加第三层,它会变得更加丑陋.

还有其他选择吗?

免责声明:这是根据coursera的progfun课程改编的

解决方法

从问题中获取以下代码:

myVector.lift(i) map (_.lift(j) map f getOrElse false) getOrElse false

这可以改写如下:

myVector.lift(i).flatMap(_.lift(j)).fold(false)(f)

或者,在Scala 2.10中引入折叠之前:

myVector.lift(i).flatMap(_.lift(j)).map(f).getOrElse(false)

关键思想是推迟尽可能长时间地解包(或映射)选项.这种方法很自然地推广到两个以上的维度.

这非常接近于你的答案中的for-comprehension(假设你想在那里包括升力),但是一旦你必须将理解包括在括号中,我个人倾向于发现desugared版本更清楚.

(编辑:李大同)

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

    推荐文章
      热点阅读