scala 融合了面相对编程和面向对象编程的思想,现在java8出世了,其中的lambda表达式和scala的语法很相似,估计面向函数编程会成为一种趋势。

通过这段时间的学习,最大的感觉就是scala语法相对于java来说要简洁得多,面向函数编程确实令人眼前一亮,下面记录下今天所学习知识的笔记。

(1)、表达式:scala的条件表达式即if/else有值,可以将此值赋给变量,这是在java不能实现的,如val s = if(x > 0) 1 else –1。如果else部分缺失了的话,如val s2 = if(x > 0) 1,如果x 不大于0的话,此时s2的值为unit,写作()。此时表达式相当于val s2  = if(x > 0) 1 else ()。

(2)、语句终止:在java中每一个语句的是以分号结束的。而scala与javaScript和其他脚本语言类似,行尾位置不需要分号。如果在单行写下多个语句,就需要将它们以分号分开。如 if(n > 0){ r = r  *  n; n –= 1}。

(3)、块表达式和赋值:在java中,块语句包含于{}中的语句序列,每当需要在逻辑分支或循环中放置多个动作时,都可以使用块语句。在scala中,{}包含一系列表达式,块最后一个表达式的值就是块的值。此特性对于那种对某个val需要分多步初始化时非常有用。如val distance = {val dx = x – x0; val dy = y – y0; sqrt(dx * dx + dy * dy)}。此时distance的值为sqrt(dx * dx + dy * dy)。赋值动作本身是没有值的,或者说值为unit类型。unit相当于java中的void,因此在scala中不能如下这样写:x =y =1

(4)、输入和输出:scala中从控制台输入信息,用readLine、readInt、readDouble等

(5)、循环:scala和java拥有想通的while和do循环。如 while (n > 0) {r = r * n; n –= 1},scala没有与java中循环对应的结构,scala中for语句:

for( i <- 1 to 10)  s= s+1 ,此表达式中i无需声明类型,该变量的类型是集合元素的类型。当遍历字符串或者数组时,通常需要使用0到n-1的区间,此时可以用until方法,for(i <- 0 until “adsad”.length) sum += s(i);此处是为了展示until的用法,此式例可以用这种写法替代: for( ch <- “adsad”) sum += ch 。scala的for循环有很丰富的功能,可以用 “变量<-表达式”提供多个生成器,用分号将它们隔开,如:for(i <- 1 to 4; j <-1 to 7) print(i * j + “ ”),并且每个生成器可以带一个守卫(以if开头的Boolean表达式),如:for(i <- 1 to 3;j <- 1 to 7 if i != j ) print(i * j "+ “ ”),第二个生成器带了 “if i != j”守卫。除了守卫之外我们还可以使用任意多的定义,如:for(i <- 1 to 3;x = i + 1;j <- x to 7 if i != j ) print(i * j "+ “ ”)。scala的for循环还可以以yield开始构造一个新的集合,每次迭代生成新集合中的一个值,如:for(i <- 1 to 10) yield i + 1 ,此时生成vector(2,3,4,5, … ,11),这类循环叫做for推导式,for推导式生成的集合和它的第一个生成器是兼容的。

(6)、函数:scala除了方法还支持函数,方法对对象进行操作,函数不是,在java中我们只能用静态方法来模拟。函数定义:def f1(x: Double) = if (x > 0) x else –x ,只要函数不是递归的,就不需要指定返回类型,scala编译器可以通过”=”号右侧的表达式类型推断出返回类型。对于递归函数,我们就必须指定返回类型,如:def f(n: Int): Int = if(n < 0) 1 else f(n - 1),如果没有返回类型,scala编译器无法校验 f(n - 1)的类型是Int。

(7)、默认参数和带名参数: 默认参数,def f(str: String, left: String = “xx”,right: String = “yy”) = left + str + right;带名参数:调用函数的时候,如果在提供参数值的时候指定了参数名,则参数顺序并不需要跟参数列表的顺序一致,如:def(left=”ss”,right=”xx”,str = “abccd”)

(8)、变长参数:顾名思义就是你可以使用任意多的参数来调用此函数,如:def sum(args: Int*) = {var r = 0; for(arg <- args) r += arg; r},调用此函数:val s =sum(2,34,23,12,23) 。函数得到一个类型为Seq的参数,如果想将一个有值的序列当做参数序列处理,你得告诉编译器你希望这个参数被当做参数序列处理,追加“:_*”,如:val s = sum(1 to 34:_*)

(9)、过程:如果函数体包含在{}中但没有前面的=号,那么返回类型就是Unit,这种函数就称作过程。我们调用过程是为了它的副作用,比如把消息输出到控制台等等。

(10)、懒值:当val被声明为懒值(lazy)时,它的初始化将被延迟,直到我们首次对它取值。如:lazy val str = scala.io.Source.fromFile("c/user/abc").mkString。如果程序不访问str,则文件不会被打开。懒值对于开销较大的初始化语言很有用。懒值处于val和def的中间状态。

(11)、异常:scala的异常工作机制和java基本上差不多,与java所不同的是scala没有“受检”异常,throw表达式有特殊类型Nothing。在if/else中很有用,如果一个分支的类型为Nothing,那么if/else表达式类型就是另一个分支的类型。scala捕获异常采用模式匹配的语法,如:

1 try
2     process(new URL("https://www.google.com") )
3 }
4 catch {
5  case _: MalformedURLException => println("Bad URL:" + url )
6  case ex: IOException => ex.PrintStackTrace()
7 }

如果你不需要使用捕获的一场对象,可以使用_来替代变量名。

scala 学习笔记(scala for the impatient)相关推荐

  1. Scala 学习笔记

    Scala 学习笔记 1 object func_exp { 2 println("Welcome to the Scala worksheet") //> Welcome ...

  2. Scala学习笔记04:内建控制结构

    Scala学习笔记04:内建控制结构 scala提供的控制结构并不算多,因为在函数式编程中,可以自己开发出各种功能的控制结构,所以scala提供的原生控制结构仅仅够用为止. 1.if - 判断 if是 ...

  3. Scala学习笔记03:操作符

    Scala学习笔记03:操作符 一.scala中操作符与方法的等价性 scala中操作符即方法.方法即操作符.scala中操作符其实是普通方法调用的另一种表现形式,运算符的使用其实就是隐含地调用对应的 ...

  4. Scala学习笔记02:数据类型、常量与变量

    Scala学习笔记02:数据类型.常量与变量 一.数据类型 1.基本数据类型 Byte 字节型 Short 短整型 Int 整型 Long 长整型 Char 字符型 String 字符串 Float ...

  5. Scala学习笔记(三)

    Scala学习笔记(三) 一.模式匹配 1. 简单模式匹配 2. 匹配类型 3. 守卫 4. 匹配样例类 5. 匹配数组 6. 匹配列表 7. 匹配元组 8. 变量声明中的模式匹配 8.1 获取数组中 ...

  6. Scala学习笔记(一)

    Scala学习笔记(一) 一.Scala简介 二.Scala安装与配置 1. 安装JDK 2. 安装Scala SDK 3. 安装IDEA插件 三.Scala解释器 1. 启动Scala解释器 2. ...

  7. 机器学习(三)--- scala学习笔记

    Scala是一门多范式的编程语言,一种类似Java的编程语言,设计初衷是实现可伸缩的语言.并集成面向对象编程和函数式编程的各种特性. Spark是UC Berkeley AMP lab所开源的类Had ...

  8. Scala学习笔记(黑马视频)

    目录 2.Scala第二章节 2.1 输出语句和分号 2.1.1 输出语句 2.1.2 分号 2.2 Scala中的常量 2.2.1 概述 2.2.2 分类 2.2.3 代码演示 2.3. Scala ...

  9. Scala学习笔记-10

    package com.leegh.oop /** * @author Guohui Li */ /** * 正则表达式 */ object RegExpressOps { def main(args ...

  10. Scala学习笔记-5

    /** * @author Guohui Li */ /** * 1.trait中未被实现的方法默认就是抽象的 * 2.在重写trait的抽象方法时不需要给出override关键字 * 3.如果你需要 ...

最新文章

  1. 一文盘点5种聚类算法,数据科学家必备!
  2. uwsgi+python+flask+nginx服务器部署
  3. mysql使用navicat(建表前与建表后)添加时间戳(创建时间、自动更新时间)
  4. 机器学习焦点,范德比尔特(Vanderbilt U)的医疗机器人以及更多开源新闻
  5. 如果走单招学计算机好考吗,单招一般多少分过 走单招好不好
  6. sql server 2012 镜像和出现的问题
  7. mysql缓存怎么防止缓存击穿_带你搞明白什么是缓存穿透、缓存击穿、缓存雪崩...
  8. 在MNIST图像上训练卷积神经网络
  9. html页面如何嵌入word在线编辑器,网页word编辑器 网页中如何嵌入word编辑器
  10. mysql数据库练习题(含答案)
  11. Mysql查询某个月的每一天的数据
  12. SQL 中的昨天、今天和明天
  13. 相关分析怎么进行?有哪些条件?
  14. Sublime Text 3 写js智能提示插件
  15. authorize scope. userlocation需要在app.json中声明permission字段
  16. 第60讲:MySQL视图的综合使用案例
  17. 图片基于base64转码技术
  18. 亚马逊Alexa的深度学习与语音识别的核心技术原理
  19. java项目编码转换不产生乱码,Java源码乱码问题 编码转换器
  20. 010 | 古村楹联在道德教育及文学素养培养中的价值及启示 | 大学生创新训练项目申请书 | 极致技术工厂

热门文章

  1. 【历史上的今天】8 月 20 日:传奇程序员诞生日;谷歌发布 Pixel 4a
  2. C++对象模型——对象的差异(第一章)
  3. Easypoi导出、导入excel
  4. Windows XP操作系统自动关机的实现
  5. 纵横网络靶场社区-Modbus协议
  6. Python实现Word文档标题格式判断
  7. EI主题词新版界面查询-Engineering Village
  8. 刚学python写了一个类,为何__del__ : 析构函数,释放对象时没有运行
  9. Google Earth Engine(GEE)——逐年批量下载sentinel-2多波段影像
  10. Gallery2图片编辑