Scala中集合中的View用法
设想以下这个计算
def eval(i: Int): Option[Int] = {
println(s"invoke with $i")
if (i % 2 == 0) {
None
} else {
Some(i + 1)
}
}
@Test
def test(): Unit = {
// 3 will also be invoked
val s = Seq(1, 3)
val f = s.flatMap(x => eval(x)).collectFirst({ case x => x})
}
test 执行的目的是想在seq中找到第一个eval函数返回的非空的值(首先Scala中flatMap计算中返回为None的值是不会被添加到几个中的)。
但是上面的计算在 1执行并且符合条件后还会继续执行,这里如何提前退出呢?
@Test
def test4(): Unit = {
val s = Seq(1, 3)
val f = s.view.flatMap(x => eval(x))
println(f.head)
}
这里通过s.view
让整个flatMap都推迟计算了,val newArr = s.view.flatMap(x => eval(x))
并不会触发计算,只有当f.head
被执行时,才触发真正的计算。
https://stackoverflow.com/questions/29061957/break-flatmap-after-first-some-occurence
https://docs.scala-lang.org/overviews/collections-2.13/views.html
本文来自博客园,作者:Aitozi,转载请注明原文链接:https://www.cnblogs.com/Aitozi/p/17204932.html