Scala 的 for yield 的用法

Scala 的 for yield 的用法

具体参考Scala for循环

今天我的朋友问了我一个问题,这个问题我也不太清楚,就是for循环中使用yield关键字

概念

for循环中的yield会将for循环中的值保存下来,保存到一个集合中,在循环结束的时候会将集合全部输出,如果被循环的是map,则输出的就是map。如果被循环的是list,则输出的就是list,以此类推。

使用println进行输出

scala> for (i <- 1 to 5)
     | println (i)
1
2
3
4
5

使用yield输出

scala> for (i <- 1 to 5)
     | yield i
res3: scala.collection.immutable.IndexedSeq[Int] = Vector(1, 2, 3, 4, 5)
scala> val a = for (i <- 1 to 5)
     | yield i
a: scala.collection.immutable.IndexedSeq[Int] = Vector(1, 2, 3, 4, 5)

scala> a
res4: scala.collection.immutable.IndexedSeq[Int] = Vector(1, 2, 3, 4, 5)

循环过滤if判断,并返回值

scala> for (e <- a if e % 2 == 0 )
     | yield e
res5: scala.collection.immutable.IndexedSeq[Int] = Vector(2, 4)
scala> a
res6: scala.collection.immutable.IndexedSeq[Int] = Vector(1, 2, 3, 4, 5)

scala> val b = 6 to 7
b: scala.collection.immutable.Range.Inclusive = Range(6, 7)

scala> for {
     | x <- a
     | y <- b
     | }
     | yield (x,y)
res7: scala.collection.immutable.IndexedSeq[(Int, Int)] = Vector((1,6), (1,7), (2,6), (2,7), (3,6), (3,7), (4,6), (4,7), (5,6), (5,7))

scala> for {
     | y <- b
     | x <- a
     | }
     | yield (x,y)
res8: scala.collection.immutable.IndexedSeq[(Int, Int)] = Vector((1,6), (2,6), (3,6), (4,6), (5,6), (1,7), (2,7), (3,7), (4,7), (5,7))

yield复杂点的使用

//找出以固定字符串结尾的文件
scala> def getTextFile(path:String) : Array[java.io.File] =
     | for {
     | file <- new java.io.File(path).listFiles
     | if file.isFile
     | if file.getName.endsWith(".txt")
     | }
     | yield file
getTextFile: (path: String)Array[java.io.File]

scala> getTextFile(".")
res9: Array[java.io.File] = Array(./a.txt)

实际开发中的应用

object Loop {
  def main(args: Array[String]): Unit = {
    val str = Array(1,2,3,4,5,6,7)

    for(i <- str ) {
      println(i)
    }

    val add  = for (i <- str) yield i +100
    println (add.toBuffer)

  }
}

这是输出结果

D:\tools\jdk\bin\java.exe "-javaagent:D:\tools\idea\IntelliJ IDEA 2018.1.6\lib\idea_rt.jar=64772:D:\tools\idea\IntelliJ IDEA 2018.1.6\bin" -Dfile.encoding=UTF-8 -classpath "D:\tools\jdk\jre\lib\charsets.jar;D:\tools\jdk\jre\lib\deploy.jar;D:\tools\jdk\jre\lib\ext\access-bridge-64.jar;D:\tools\jdk\jre\lib\ext\cldrdata.jar;D:\tools\jdk\jre\lib\ext\dnsns.jar;D:\tools\jdk\jre\lib\ext\jaccess.jar;D:\tools\jdk\jre\lib\ext\jfxrt.jar;D:\tools\jdk\jre\lib\ext\localedata.jar;D:\tools\jdk\jre\lib\ext\nashorn.jar;D:\tools\jdk\jre\lib\ext\sunec.jar;D:\tools\jdk\jre\lib\ext\sunjce_provider.jar;D:\tools\jdk\jre\lib\ext\sunmscapi.jar;D:\tools\jdk\jre\lib\ext\sunpkcs11.jar;D:\tools\jdk\jre\lib\ext\zipfs.jar;D:\tools\jdk\jre\lib\javaws.jar;D:\tools\jdk\jre\lib\jce.jar;D:\tools\jdk\jre\lib\jfr.jar;D:\tools\jdk\jre\lib\jfxswt.jar;D:\tools\jdk\jre\lib\jsse.jar;D:\tools\jdk\jre\lib\management-agent.jar;D:\tools\jdk\jre\lib\plugin.jar;D:\tools\jdk\jre\lib\resources.jar;D:\tools\jdk\jre\lib\rt.jar;D:\idea project\HelloScala\out\production\HelloScala;D:\tools\Scala\lib\scala-actors-2.11.0.jar;D:\tools\Scala\lib\scala-actors-migration_2.11-1.1.0.jar;D:\tools\Scala\lib\scala-library.jar;D:\tools\Scala\lib\scala-parser-combinators_2.11-1.0.4.jar;D:\tools\Scala\lib\scala-reflect.jar;D:\tools\Scala\lib\scala-swing_2.11-1.0.2.jar" day03.Loop
1
2
3
4
5
6
7
ArrayBuffer(101, 102, 103, 104, 105, 106, 107)

Process finished with exit code 0

参考

posted @ 2022-08-02 11:23  赤兔胭脂小吕布  阅读(365)  评论(0编辑  收藏  举报