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