33.scala编程思想笔记——推导

来源:互联网 发布:哈佛 知乎 编辑:程序博客网 时间:2024/06/18 07:10

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.

0 0
原创粉丝点击