scala-04For与Function进阶实战、Lazy的使用

For与Function进阶实战、Lazy的使用

一、for循环的进阶实战

Def main=(args:Array[String]):Unit{

For(i<- 1 to 3;j<- 3 to 8)

Println((100*i+j)+” ")

也可在for循环中加入条件表达式:

For(i<- 1 to 3;j<- 3 to 8  if i!=j)

Println((100*i+j)+” ")

}

定义函数的时候一般函数都有值,函数可以作为函数的参数去赋值

def  Adsds(x: int) =x+100

val add=(x: int) => x+200

二、Function的进阶实战

三、Lazy延迟加载和延迟执行

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))

匿名函数-是函数最常见的一种形态,因为Scala里只关注函数怎么做,不关注它的名字

def main(args: Array[String]): Unit = {    val add = (x: Int) => x + 200          //将匿名函数的值赋值给常量add,=>是将接收的整数类型去加200    println("The result from a val is " +  add(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) )}

有默认参数的函数

//content参数被默认为I love Sparkdef 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", "@", "@"))}

参数可变的函数

//通过*表示可以输入多个参数,即参数可变.这里将传入的参数累加,赋值给resultdef 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.Sourceobject Test {  def main(args: Array[String]): Unit = {    lazy val file = Source.fromFile("e:\\test.txt")    println("Scala");//    for (line <- file.getLines()) {//      println(line);//    }  }}

时间: 2024-10-08 14:56:40

scala-04For与Function进阶实战、Lazy的使用的相关文章

For与Function进阶实战、Lazy的使用笔记总结

本期内容: 1:For循环的进阶实战,(更多的实战代码) 2:Function进阶实战,(Function更多的定义和实现方式) 3:Lazy的使用,(延迟加载) For循环常用: for(i <- 1 to 2; j <- 1 to 2 if i!=j){ println((100*i+j)+" ") } Function函数: 注意:(特别重要) 1:scala中的函数是一定有值返回的,但可以在声明时不明确指定函数的返回值,代码块中的最后一个参数作为scala函数的返回

王家林亲传《DT大数据梦工厂》第四讲For与Function进阶实战、Lazy的使用

你想了解大数据,你想成为年薪百万吗?那你还等着什么,快点来吧!跟着王家林老师学习spark大数据 第四讲For与Function进阶实战.Lazy的使用 For循环 object For_Function_Advanced{ def  main ( args: Array[String]): Unit ={ for(i  <-  1 to 2;j <-  1 to 2)print((100*i + j) + “ ”) printIn for(i  <-  1 to 2;j <- 

004-For与Function进阶实战、Lazy的使用

004-For与Function进阶实战.Lazy的使用 For进阶 非常常见的形式 可以加入条件表达式进行数据过滤 Function进阶 函数是有值的(默认的话为Unit),所以可以直接将结果赋值给变量 =>(可理解为做法)匿名函数的使用 只对函数的做法关心并不关心函数的名字 匿名函数执行方法 函数的值赋值给一个变量 通过变量的名称加上()(括号进行函数传值) 递归调用时候必须要声明函数的返回值类型 函数中参数的默认初始化 如果在调用中传递参数的值会覆盖掉初始化的值 可变参数的定义 Lazy的

Scala学习回顾(四)---- For与Function进阶实战、Lazy的使用

注:本文学习源自:DT大数据梦工厂(微信公众号:DT_Spark) 1.For循环的进阶 2.函数的进阶 3.lazy的作用 参考资料: DT大数据梦工厂微信公众号:DT_Spark

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

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 <-

MySQL的进阶实战篇

[版权申明]未经博主同意,谢绝转载!(请尊重原创,博主保留追究权) http://blog.csdn.net/javazejian/article/details/69857949 出自[zejian的博客] 关联文章: MySQL的初次见面礼基础实战篇 MySQL的进阶实战篇 本篇上一篇博文MySQL的初次见面礼基础实战篇的延续,是mysql的进阶内容的记录,本篇主要知识点如下: 进阶实战篇 进阶实战篇 mysql视图机制 什么是视图 视图创建与使用 视图的本质 高效索引 使用索引的理由 索引

Scala界面Scala界面Panel、Layout实战

学习了Scala界面Scala界面Panel.Layout实战详解,Panel是一个容器,有很多子类,复写了方法top,定义了button和label,在BoxPanel中加入button和label例子如下 Import  scala.swing._ Object  GUI_Panel_Layout extends simpleswingApplication{ def top =new MaiFram{ Title=”Second GUI” Val button=new Button{ Te

第52讲:Scala中路径依赖代码实战详解

<DT大数据梦工厂>大数据实战视频"Scala深入浅出实战经典"视频.音频和PPT下载!第52讲:Scala中路径依赖代码实战详解百度云:http://pan.baidu.com/s/1gdES4hX360云盘:http://yunpan.cn/ccHXX2Wkrrrt4 访问密码 c489腾讯微云:http://url.cn/VV5kx5 记录: Scala中内部类的路径依赖非常适合现在互联网看待事物所属关系,组织关系. 根据依赖的外部实例的不同,内部类类型会有所不同.由

新书:Scala语言基础与开发实战

大数据科学丛书系列的最新一本<Scala语言基础与开发实战>即将面市,预计月底上架.内容还是不错的,文笔简介,内容实用,值得学.用. 大数据资深培训师王家林新作. 详细介绍大数据开发语言Scala及其在分布式框架Akka和Kafka中的应用. 秉承"实战"类图书特点,解析大量代码的编写操作,具有较强的可操作性,便于读者学习和理解. 算上再过几个月出版的<Spark内核解析及性能调优>,一年时间,大数据科学丛书系列之Spark的小套系基本形成了:从学习Spark的