我有一个矢量矢量,我正在访问以应用布尔函数.即
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课程改编的
从问题中取出以下代码:
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
在其中),但是一旦您必须将理解包含在括号中,我个人倾向于发现脱糖版本更清晰。
归档时间: |
|
查看次数: |
1274 次 |
最近记录: |