33.scala编程思想笔记——推导
欢迎转载,转载请标明出处:http://blog.csdn.net/notbaron/article/details/50445783
源码下载连接请见第一篇笔记。
For和if的组合,称为for推导,简称推导。
在scala中推导将 生成器、过滤器和定义组合在一起。
返回偶数,大于5的方法如下:
import com.atomicscala.AtomicTest._
def evenGT5(v:Vector[Int]):Vector[Int] = {
// 'var' sowe can reassign 'result':
var result =Vector[Int]()
for {
n <- v
if n > 5
if n % 2 ==0
} result =result :+ n
result
}
val v = Vector(1,2,3,5,6,7,8,10,13,14,17)
evenGT5(v) is Vector(6, 8, 10, 14)
输出如下:
Vector(6, 8, 10, 14)
使用{} 可以使得for可以包含多条语句或表达式。
也可以将result用作val,不过可以使用yield关键字,当声明yield n时,会把值n交出来。
如下:
import com.atomicscala.AtomicTest._
def yielding(v:Vector[Int]):Vector[Int]={
val result =for {
n <- v
if n <10
if n % 2 !=0
} yield n
result
}
val v = Vector(1,2,3,5,6,7,8,10,13,14,17)
yielding(v) is Vector(1, 3, 5, 7)
yield总是会填充容器,对result赋值之前创建完整的Vector.这样result就可以是val而不是var.
与其他任何表达式一样,yield表达式也可以组合,如下:
import com.atomicscala.AtomicTest._
def yielding3(v:Vector[Int]):Vector[Int]={
for {
n <- v
if n <10
isOdd = (n% 2 != 0)
if(isOdd)
} yield {
val u = n *10
u + 2
}
}
val v = Vector(1,2,3,5,6,7,8,10,13,14,17)
yielding3(v) is Vector(12, 32, 52, 72)
可以让一个推导只与一个yield表达式相关联,并且不能将yield表达式置于推导体之前。但是推导可以嵌套如下:
import com.atomicscala.AtomicTest._
def yielding4(v:Vector[Int]) = {
for {
n <- v
if n <10
isOdd = (n% 2 != 0)
if(isOdd)
} yield {
for(u <-Range(0, n))
yield u
}
}
val v = Vector(1,2,3,5,6,7,8,10,13,14,17)
yielding4(v) is Vector(
Vector(0),
Vector(0, 1,2),
Vector(0, 1,2, 3, 4),
Vector(0, 1,2, 3, 4, 5, 6)
)
每个yield都会产生一个Vector,最终结果是一个Vector的Vector.