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
                    
                
                
            
        
浙公网安备 33010602011771号