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

Ste*_*hen 8 scala

我有一个矢量矢量,我正在访问以应用布尔函数.即

Vector[Vector[T]]我要按照f(myVector(i)(j))f类型的方式执行某些操作 T => Boolean.

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

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

哪里f(defaultT)会回来false ,但我希望我可以只设置一个默认值,而不是一个功能.

我可以用电梯给我一个Option,但它在第二级不能很好地构成: 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))
}
Run Code Online (Sandbox Code Playgroud)

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

还有其他选择吗?

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

Tra*_*own 3

从问题中取出以下代码:

myVector.lift(i) map (_.lift(j) map f getOrElse false) getOrElse false
Run Code Online (Sandbox Code Playgroud)

这可以重写如下:

myVector.lift(i).flatMap(_.lift(j)).fold(false)(f)
Run Code Online (Sandbox Code Playgroud)

或者,之前fold在 Scala 2.10 中引入过:

myVector.lift(i).flatMap(_.lift(j)).map(f).getOrElse(false)
Run Code Online (Sandbox Code Playgroud)

Option关键思想是尽可能推迟解包(或映射) 。这种方法可以很自然地推广到二维以上。

这非常接近于for您答案中的 - 理解(假设您打算包含lift在其中),但是一旦您必须将理解包含在括号中,我个人倾向于发现脱糖版本更清晰。