码迷,mamicode.com
首页 > 其他好文 > 详细

04Scla学习:For与Function进阶实战、Lazy的使用

时间:2015-07-27 14:44:28      阅读:93      评论:0      收藏:0      [点我收藏+]

标签:

1 For 循环进阶
1) Fo使用
    可以看到以下代码i,j都没有进行申明类型,它可以根据右侧类型元素自动进行类型推导。
    在本次for循环中,有2个集合(1 to 2)有两个元素,通过左箭头 <- 把元素赋值给i 和j.
  For循环这里有个限制条件 i  != j, 当i=1时,符合条件的是j=2, 当i=2时, 符合条件的j是1。即 100*i+2 = 102, 200*2 +1 =201 ;
  def main(args: Array[String]): Unit = {
    for (i <- 1 to 2; j <- 1 to 2 if i != j)
      println((100 * i + j) + " ");
  }
运行代码得到如下结果:
102  
201
 
2) 函数是有值的
   函数的返回值可以有值,如果没有值就是void,以下代码就是有返回值。
def addA(x: Int) = x + 100
 println("The result from a function is :" + addA(2)) 
 运行代码得到如下结果:
The result from a function is :102
3) 匿名函数
   还有一种声明函数的方法,就是声明一个匿名函数,所谓匿名函数就是没有名字的函数,这点和js有点像,学过js的同学应该很快就理解了。
或者可以说把匿名函数复制给一个常量,通过常量调用匿名函数。
    通过 val add = (x: int) => x +100 ,来声明一个匿名函数,把 add指向这个匿名函数,匿名函数的实现使用右指针 =>指向实现的方法体。
通过 add(2)调用匿名函数。
def main(args: Array[String]): Unit = {
    val add = (x: Int) => x + 200
    println("The result from a val is " +  add(2))
 
}
 运行代码得到如下结果:
The result from a val is 202
 
4)函数的递归调用
递归调用实际上就是自己调用自己的函数,单要注意递归需要有退出循环的条件,否则就会造成“死循环”。
以下代码试求10的斐波那数,就是 10 * 9 * 8 * 7 * 6* 5 * 4 * 3 * 2 * 1  
 def main(args: Array[String]): Unit = {
    def fac(n:Int): Int = if (n <= 0) 1 else n * fac(n - 1) 
     println("The result from  a fac is : " + fac(10) )
}
 
运行代码得到如下结果:
The result from a val is : 3628800
5) 有初始值的函数
在本例中输入3个参数, content, left, right. 其中content 是输入的内容, left和right是左右”护法“,呵呵,其实是左右连接符。
  def main(args: Array[String]): Unit = {
    def combine(content: String, left: String = "[", right: String = "]") = left + content + right
    println("The result from a combine is : " + combine("I love Spark", "@", "@"))
  }
运行代码得到如下结果:
The result from a combine is : &I love Spark&
 
6)函数的参数是可变的
函数的输入值不是固定的,通过*表示可以输入多个参数,既可变参数。
 def main(args: Array[String]): Unit = {
      def connected(args: Int*) = {
          var result = 0
          for(arg <- args) result += arg
          result
      }
     println("The result from a connected is : " + connected(1,2,3,4,5) )
       println("The result from a connected is : " + connected(1,2,3,4,5,6) )
      
     
  }
运行代码得到如下结果:
The result from a connected is : 15
The result from a connected is : 21
 
 
3 延迟加载lazy load
如果在E盘下不存在 users.txt, 使用 Source.fromFile()函数读取文件,就会报错抛出异常,
但是如果引用的常量前加上 lazy,它就不会报错。它只有在第一次被使用时,才被实例化。
注意:只要在下面的代码中不使用,就不会抛出异常。
import scala.io.Source
object Test {
  def main(args: Array[String]): Unit = {
    lazy val file = Source.fromFile("e:\\userx.txt")
    println("Scala");
//    for (line <- file.getLines()) {
//      println(line);
//    }
  }
}
 
 
 
 
 
DT大数据梦工厂的微信公众号是DT_Spark,每天都会有大数据实战视频发布,请您持续学习。
 
 
Scala 深入浅出实战经典(1-64讲)完整视频、PPT、代码下载:
百度云盘:http://pan.baidu.com/s/1c0noOt6 
腾讯微云:http://url.cn/TnGbdC 
360云盘:http://yunpan.cn/cQ4c2UALDjSKy   访问密码 45e2 

 

 
 
 
 
 
 
 
 

04Scla学习:For与Function进阶实战、Lazy的使用

标签:

原文地址:http://www.cnblogs.com/wangshuo1/p/4679848.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!