Scala学习第四天 Scala的For与Function进阶实战、Lazy的使用
2015-08-28 19:49
381 查看
信息来源于 DT大数据梦工厂微信公众账号:DT_Spark
DT大数据梦工厂群号:302306504王家林老师微信号:wangjialinandroid
1、For&Function进阶
(1)For 使用
我们看到与Java不同的是,代码i,j都没有进行申明类型,它可以根据右侧类型元素自动进行类型推导。类型推导是Scala中非常强大的一个内容。
(2)Function函数使用
函数有值是scala中的非常重要的特点,因为函数有值,函数执行必然有结果,所以函数可以作为函数的参数去传递,这是一个非常重要的结论,这个结论导致了函数式编程很多重要的技巧。
1)匿名函数-是函数最常见的一种形态,因为Scala里只关注函数怎么做,不关注它的名字
2)函数返回值一般不指定,Scala会自动推导,但递归函数除外,因为递归函数并不知道上一次计算返回的什么样的结果
3)有默认参数的函数
4)参数可变的函数
2、lazy懒加载
如果在E盘下不存在test.txt, 使用 Source.fromFile()函数读取文件,就会报错抛出异常, 但是如果引用的变量或常量前加上 lazy,它只有在第一次被使用时,才被实例化,lazy会延迟执行。当发生错误,但没有立即被使用,程序还是OK,只有在被使用才会报错,懒加载的意义在于延迟执行,可以看到一个计算的更多步骤,优化的范围更大,优化的力度也更大。
例如我们在java中,一个错误就可能让我们的后边的工作无法进行,而延迟执行,可以放任这个错误,继续后边的工作,再从整体的逻辑里再去优化解决这个错误,会更好。
Scala 深入浅出实战经典(1-64讲)完整视频、PPT、代码下载:
百度云盘:http://pan.baidu.com/s/1c0noOt6
腾讯微云:http://url.cn/TnGbdC
360云盘:http://yunpan.cn/cQ4c2UALDjSKy 访问密码 45e2
DT大数据梦工厂群号:302306504王家林老师微信号:wangjialinandroid
1、For&Function进阶
(1)For 使用
def main(args: Array[String]) : Unit = { for (i <- 1 to 2; j <- 1 to 2 if i != j) /*将1到2的集合每次循环赋值给i,将1到2的集合每次循环赋值给j ,如果i!=j,就输出当i=1,j=2结果为102,当i=2,j=1 结果是201*/ println((100 * i + j) + " ") //运行代码得到如下结果: 102 201
我们看到与Java不同的是,代码i,j都没有进行申明类型,它可以根据右侧类型元素自动进行类型推导。类型推导是Scala中非常强大的一个内容。
(2)Function函数使用
函数有值是scala中的非常重要的特点,因为函数有值,函数执行必然有结果,所以函数可以作为函数的参数去传递,这是一个非常重要的结论,这个结论导致了函数式编程很多重要的技巧。
def addA(x: Int) = x + 100 //定义函数addA,它的参数类型是整数,因为函数有值,所以一般有=号, =号右侧是函数计算过程 println("The result from a function is :" + addA(2))
1)匿名函数-是函数最常见的一种形态,因为Scala里只关注函数怎么做,不关注它的名字
def main(args: Array[String]): Unit = { val add = (x: Int) => x + 200 /*将匿名函数的值赋值给常量add,=>是将接收的整数类型去加 200*/ println("The result from a val is " + add(2)) }
2)函数返回值一般不指定,Scala会自动推导,但递归函数除外,因为递归函数并不知道上一次计算返回的什么样的结果
//这里是求斐波那序列的值 def main(args: Array[String]): Unit = { def fac(n:Int): Int = if (n <= 0) 1 else n * fac(n - 1) //这里可以看到返回类型是int,如果不指定会报错 println("The result from a fac is : " + fac(10) ) }
3)有默认参数的函数
//content参数被默认为I love Spark def main(args: Array[String]): Unit = { "[", right: String = "]") = left + content + right println("The result from a combine is : " + combine("I love Spark", "@", "@")) }
4)参数可变的函数
//通过*表示可以输入多个参数,即参数可变.这里将传入的参数累加 ,赋值给result 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) ) }
2、lazy懒加载
如果在E盘下不存在test.txt, 使用 Source.fromFile()函数读取文件,就会报错抛出异常, 但是如果引用的变量或常量前加上 lazy,它只有在第一次被使用时,才被实例化,lazy会延迟执行。当发生错误,但没有立即被使用,程序还是OK,只有在被使用才会报错,懒加载的意义在于延迟执行,可以看到一个计算的更多步骤,优化的范围更大,优化的力度也更大。
例如我们在java中,一个错误就可能让我们的后边的工作无法进行,而延迟执行,可以放任这个错误,继续后边的工作,再从整体的逻辑里再去优化解决这个错误,会更好。
import scala.io.Source object Test { def main(args: Array[String]): Unit = { lazy val file = Source.fromFile("e:\\test.txt") println("Scala"); // for (line <- file.getLines()) { // println(line); // } } }
Scala 深入浅出实战经典(1-64讲)完整视频、PPT、代码下载:
百度云盘:http://pan.baidu.com/s/1c0noOt6
腾讯微云:http://url.cn/TnGbdC
360云盘:http://yunpan.cn/cQ4c2UALDjSKy 访问密码 45e2
相关文章推荐
- 记住效率是做好软件测试工作的灵魂
- 把一个C#方法注册进Lua的一个全局方法
- BUG平台应该是一个知识库
- AVR Programming Methods
- [UVA1262]Password
- 华为oj:名字的漂亮度
- 软件测试质量和效率评价之我见
- git 一直无法push的解决办法
- iOS 笔记五:手势识别 UIGestureRecognizer
- Java之旅EJB(1)——兵未动,粮草先行(jboss)
- Android中PopupWindow的使用
- MSSQLSERVER数据库- 作业调度定时备份数据库
- oracle客户端连接linux服务器上的oracle
- 一些 Quality Center引发的测试管理思考
- HDU 1533(最小费用流)
- DevExpress TreeList用法总结
- java IO学习笔记
- 【C语言连载六】--------变量、修饰词、结构体、枚举、typedef
- 机械臂运动学入门(二)
- 使用RecyclerView碰到的若干问题