在Scala中嵌套Seqs中是否存在一种简单的默认方式?
我有一个矢量矢量,我正在访问以应用布尔函数.即
矢量[Vector [T]]我将要执行的内容 但是这不会做边界检查,我不能得到一些非常优雅的东西. 我可以使用applyOrElse: 其中f(defaultT)将返回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版本更清楚. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |