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

posted @ 2023-03-10 22:57  血染河山  阅读(26)  评论(0编辑  收藏  举报