一.引言
对 Map 数据进行翻转时,用到了 for 循环 + yield 的语法,在此记录一下 for + yield 的相关使用。yield 负责将 for 循环中的数据保存下来,待循环结束后返回保存的数据,即 for + yield 有返回值,其返回类型由 for 循环的原始数据类型决定, Array -> Array、Set -> Set,Map -> Map 依次类推。
二.相关示例
1.For + Yield Demo
循环中 yield 将数据缓存下来,保存在对应数据结构中,循环结束后返回,这里给出最基本的数组示例,这里将数组中的数据乘二得到最后的结果,multiplyYield 的类型也是 Array。
val range = (1 to 10).toArray
val multiplyYield = for (num <- range) yield 2 * num
println(multiplyYield.mkString(","))
2.For + Yield & If 条件控制
for 循环过程中,可以通过 if 控制哪些数据执行 yield 逻辑,for 循环中可以添加单个和多个 if 对数据进行筛选。
A.单独 If 条件控制
val conditionYield = for (num <- range if num > 5) yield num + 3
println(conditionYield.mkString(","))
B.多重 If 条件控制
val multiConditionYield = for {
num <- range
if num % 2 == 0
if num > 5
} yield num * 10
println(multiConditionYield.mkString(","))
3.For + Yield 不改变数据结构类型
前面示例中均采用 Array,返回的也都是 Array,通过 Set,List 实验可以发现,For + Yield 的对应关系。
val testSet = mutable.Set("1", "2", "3")
val setYield = for (elem <- testSet) yield elem
println(setYield)
val testList = Array("0", "1", "2").toList
val listYield = for (elem <- testList) yield elem
println(listYield)
4.For + Yield 数据量
for 循环时 yield 产生的数据类似于缓存,因此需要注意 for 期间生成的数据量,数据量过大时会导致 GC overhead limit exceeded。
val testNums = 0 until Int.MaxValue
val numsYield = for (elem <- testNums) yield elem
三.总结
For + Yield 可以循环生成数据且不改变数据类型。