标识符

可用的字符

  • 处理括号类字符,分隔符之外,其他所有的可打印的ASCII字符,如字母,数字,下划线和美元符号($)均可出现在Scala标识符中
  • 插入符包括了(,) [,] {,and}
  • 分隔符包括 ` ' " . ; ,等
  • Scala还允许在标识符中使用编码在 \u0020到\u007F之间的字符,如数学符号,想 / 和 < 这样的操作符字符以及其他的一些符号

不能使用保留字.

普通标识符

  • 常见的标识符往往由字母或下划线开头,后面跟着一些字母,数字,下划线和$符
  • Scala允许使用Unicode格式的字符
  • $符在Scala内部会作为特定作用,尽量不要使用
  • Scala编译器会将下划线之后,空格之前的所有字符视为标识符的一部分
  • 假如在下划线后输入了操作符,那么不允许在操作符后输入字母或数字
  • 假如某一标识符以操作符开头,那么后面的字符也必须是操作符字符

示例

  1. val xyz_++= = 1

使用反引号定义标识符

可以通过反引号定义标识符,两个反引号内的任意长度的字符串便是定义的标识符.

  1. def `test that addition work`= assert(1 + 1 = 2)

无参数方法

  • 对于不包含参数的方法,除了可以选择使用中缀调用或后缀调用方式之外,Scala还允许用户灵活决定是否使用括号
  • 定义无参方法时省略了括号,那么在调用这些方法时必须省略括号
  • 定义无参方法时添加了空括号,那么调用该方法时可以选择省略或保留括号

几个等价表达式

  1. List(1, 2, 3, 4).filter((i: Int) => isEven(i)).foreach((i: Int) => println(i))
  2. List(1, 2, 3, 4).filter(i => isEven(i)).foreach(i => println(i))
  3. List(1, 2, 3, 4).filter(isEven).foreach(println)
  4. List(1, 2, 3, 4) filter isEven foreach println

优先级规则

  1. 1. 所有字母
  2. 2. |
  3. 3. ^
  4. 4. &
  5. 5. < >
  6. 6. = !
  7. 7. :
  8. 8. + -
  9. 9. * / %
  10. 10. 其他特殊字符
  • 所有操作符都是方法
  • 并不是所有方法都是左结合
  • 任何名字以冒号(:)结尾的方法均与其右边的对象绑定

cons操作

  • cons是constructor的缩写
  • cons操作指通过::方法将某一元素放置到列表前面

示例

  1. scala> val list = List('c', 'd')
  2. list: List[Char] = List(c, d)
  3. scala> 'a' :: list
  4. res1: List[Char] = List(a, c, d)
  5. scala> val list = List('c', 'd')
  6. list: List[Char] = List(c, d)
  7. scala> 'b' :: list
  8. res2: List[Char] = List(b, c, d)
  9. scala> list.::('a')
  10. res3: List[Char] = List(a, c, d)
  11. scala> 'a' :: list
  12. res4: List[Char] = List(a, c, d)
  13. scala> 'b' :: list
  14. res5: List[Char] = List(b, c, d)

注意:

  • 'a' :: list 等价于 list.::('a')

  • 不能使用该方法重复插入多个字符

if语句

  • Scala的if语句可以向Java中一样使用

    1. if (2 + 2 = 5) {
    2. println("if")
    3. } else if (2 + 2 = 3) {
    4. println("else if")
    5. } else {
    6. println("else")
    7. }
  • Scala中的if语句是有返回值的. 可以将if表达式的结果值赋值给其他变量. 以下面代码为例.

    1. val configFile = new java.io.File("someFile.txt")
    2. val configFilePath = if (configFile.exists()) {
    3. configFile.getAbsolutePath()
    4. } else {
    5. configFile.createNewFile()
    6. configFile.getAbsolutePath()
    7. }

    if语句返回值的类型也被称为所有条件分支的最小上界类型,也就是与每条each子句可能返回值类型最接近的父类型.在上面例子中,configFilePath 是if表达式的结果值,该if表达式将执行文件不存在的条件分支(假定),并返回新创建文件的绝对路径.将if语句的返回值赋予变量configFilePath .

Scala不支持三元表达式

循环

for推导式

for循环

示例

代码
  1. val list = List("A", "B", "C")
  2. for (item <- list)
  3. println(item)
输出
  1. A
  2. B
  3. C

生成器表达式

  • item <- list这样的表达式被称为生成器表达式
  • 该表达式会基于集合生成单独的数值
  • 左箭头操作符(<-)用于对象列表这样的集合进行遍历

保护式: 筛选元素

  • for语句中可以加入if表达式来筛选元素,这些表达式被称为保护式(guard)

示例

代码
  1. val list = List("ABC", "CDE", "EFG")
  2. for (item <- list
  3. if item.contains("C")
  4. )
  5. println(item)
输出
  1. ABC
  2. CDE

添加多个保护式

示例
  1. val list = List("ABC", "BCD", "CDE")
  2. for (item <- list
  3. if item.contains("B")
  4. if !item.startsWith("A")
  5. )
  6. println(item)
  7. for (item <- list
  8. if item.contains("B") && !item.startsWith("A")
  9. )
  10. println(item)
输出
  1. BCD
  2. BCD
  • 分别为两个for循环的输出

Yielding

  • 使用yielding关键字能在for表达式中生成新的集合

示例

代码
  1. val list = List("ABC", "BCD", "CDE")
  2. val filterItems = for {item <- list
  3. if item.contains("B")
  4. if !item.startsWith("A")
  5. } yield item
  6. filterItems
运行
  1. scala> val list = List("ABC", "BCD", "CDE")
  2. list: List[String] = List(ABC, BCD, CDE)
  3. scala> val filterItems = for {item <- list
  4. | if item.contains("B")
  5. | if !item.startsWith("A")
  6. | } yield item
  7. filterItems: List[String] = List(BCD)

扩展作用域与值定义

  • 能够在for表达式中的最初部分定义值,并可在以后的表达式中使用该值

示例

代码
  1. val list = List("abc", "bcd", "cde")
  2. val upcaseItems = for {
  3. item <- list
  4. upcaseItem = item.toUpperCase()
  5. } yield upcaseItem
运行
  1. scala> val list = List("abc", "bcd", "cde")
  2. list: List[String] = List(abc, bcd, cde)
  3. scala>
  4. | val upcaseItems = for {
  5. | item <- list
  6. | upcaseItem = item.toUpperCase()
  7. | } yield upcaseItem
  8. upcaseItems: List[String] = List(ABC, BCD, CDE)

while循环

示例

  1. while (表达式) {
  2. do something
  3. }

do...while循环

示例

  1. var count = 0
  2. do {
  3. count += 1
  4. } while(count < 10)

条件操作符

操作符 操作
&& 和操作
|| 或操作
> 大于
>= 大于或等于
< 小于
<= 小于或等于
== 等于
!= 不等于
  • &&|| 是短路操作符

  • 在Java中== 只会对对象引用进行比较, 调用equals来比较字段值; Scala使用== 符执行逻辑上的相等检查. 即调用equals方法进行判断.

    1. public class Person {
    2. private String name;
    3. private int age;
    4. public Person(String name, int age) {
    5. this.name = name;
    6. this.age = age;
    7. }
    8. public boolean equals(Object obj) {
    9. return true;
    10. }
    11. public static void main(String args[]) {
    12. Person p1 = new Person("sun", 20);
    13. Person p2 = new Person("li", 20);
    14. System.out.println(p1 == p2);
    15. }
    16. }
    17. // 输出:
    18. false
    1. class Person(var name: String, var age: Int) {
    2. override def equals(obj: scala.Any): Boolean = true
    3. }
    4. val p1 = new Person("sun", 20)
    5. val p2 = new Person("sun", 20)
    6. println(p1 == p2)
    7. // 输出:
    8. true

使用try...catch...final子句

  • Scala使用模式匹配来捕获异常, 而Java使用单独的catch子句来捕获各个异常
  • 使用case NonFatal(ex) => ... 子句使用scala.util.control.NonFatal 匹配了所有的非致命性异常
  • 通过编写throw new MyBadException(...) 抛出异常
  • 如果自定义异常是一个case类,那么抛出异常时可以省略new关键字

实例

  1. try {
  2. ...
  3. } catch {
  4. case NonFatal(ex) => println(s"Non fatal exception! $ex")
  5. case ...
  6. } finally {
  7. ...
  8. }

惰性赋值

  • 惰性赋值是与传名参数相关的技术
  • 如果希望以延迟的方式初始化某值, 并且表达式不会被重复计算, 则需要使用惰性赋值
  • 常见应用场景
    • 由于表达式执行代价昂贵(比如打开一个数据库连接), 希望能推迟该操作, 直到确实需要表达式结果时才执行它
    • 为了缩短模块启动时间, 可以将当前不需要的某些工作推迟执行
    • 为了确保对象中其他字段的初始化过程能优先执行, 需要将某些字段惰性化

示例

  1. object ExpensiveResource {
  2. lazy val resource: Int = init()
  3. def init(): Int = {
  4. // 某些代价昂贵的操作
  5. 0
  6. }
  7. }
  • lazy关键字意味着求值过程会被推迟,只有需要时才会执行计算
  • 首次使用惰性值时, 初始化代码才会被执行一次, 这种只能执行一次的计算对于可变字段而言没有任何意义.因此lazy关键字不能修饰var变量
  • 通过**保护式来实现惰性值

枚举

  • Scala通过在标准库中专门定义Enumeration类实现枚举

示例一

代码

  1. // file: enum.scala
  2. object Breed extends Enumeration {
  3. type Breed = Value
  4. val doberman = Value("Doberman Pinscher")
  5. val yorkie = Value("Yorkshire Terrier")
  6. val scottie = Value("Scottish Terrier")
  7. val dane = Value("Great Dane")
  8. val portie = Value("Portuguese Water Dog")
  9. }
  10. import Breed._
  11. println("ID\tBreed")
  12. for (breed <- Breed.values) println(s"${breed.id}\t$breed")
  13. println("\nJust Terriers:")
  14. Breed.values filter (_.toString.endsWith("Terrier")) foreach println
  15. def isTerrier(b: Breed) = b.toString.endsWith("Terrier")
  16. println("\nJust Terriers:")
  17. Breed.values filter isTerrier foreach println

运行

scala enum.scala

输出

  1. ID Breed
  2. 0 Doberman Pinscher
  3. 1 Yorkshire Terrier
  4. 2 Scottish Terrier
  5. 3 Great Dane
  6. 4 Portuguese Water Dog
  7. Just Terriers:
  8. Yorkshire Terrier
  9. Scottish Terrier
  10. Just Terriers:
  11. Yorkshire Terrier
  12. Scottish Terrier

可插入字符串

下面是一个简单示例:

  1. val name = "Buck Trends"
  2. println(s"Hello, $name")

格式化

下面是几个对可插入字符串进行格式化的示例.

  1. scala> val gross = 100000F
  2. gross: Float = 100000.0
  3. scala> val net = 64000F
  4. net: Float = 64000.0
  5. scala> val percent = (net / gross) * 100
  6. percent: Float = 64.0
  7. scala> println(f"$$${gross}%.2f vs. $$${net}%.2f or ${percent}%.1f%%")
  8. $100000.00 vs. $64000.00 or 64.0%
  9. scala> val s = "%02d: name = %s".format(5, "Dean Wampler")
  10. s: String = 05: name = Dean Wampler
  11. // 原生插入器
  12. scala> val name = "Dean Wampler"
  13. name: String = Dean Wampler
  14. scala> s"123\n$name\n456"
  15. res1: String =
  16. 123
  17. Dean Wampler
  18. 456
  19. scala> raw"123\n$name\n456"
  20. res2: String = 123\nDean Wampler\n456
  • 使用$$ 打印一个$
  • 使用%% 打印一个%

Scala入门笔记二的更多相关文章

  1. 大数据入门第二十一天——scala入门(二)并发编程Akka

    一.概述 1.什么是akka Akka基于Actor模型,提供了一个用于构建可扩展的(Scalable).弹性的(Resilient).快速响应的(Responsive)应用程序的平台. 更多入门的基 ...

  2. 大数据入门第二十天——scala入门(二)scala基础02

    一. 类.对象.继承.特质 1.类 Scala的类与Java.C++的类比起来更简洁 定义: package com.jiangbei //在Scala中,类并不用声明为public. //Scala ...

  3. 大数据入门第二十天——scala入门(二)scala基础01

    一.基础语法 1.变量类型 // 上表中列出的数据类型都是对象,也就是说scala没有java中的原生类型.在scala是可以对数字等基础类型调用方法的. 2.变量声明——能用val的尽量使用val! ...

  4. Shader 入门笔记(二) CPU和GPU之间的通信,渲染流水线

    渲染流水线 1)应用阶段(CPU处理) 首先,准备好场景数据(摄像机位置,视锥体,模型和光源等) 接着,做粗粒度剔除工作. 最后,设置好每个模型的渲染状态(使用的材质,纹理,shader等) 这一阶段 ...

  5. scala 学习笔记二 方法与函数

    1.介绍 Scala 有方法与函数,二者在语义上的区别很小.Scala 方法是类的一部分,而函数是一个对象可以赋值给一个变量.换句话来说在类中定义的函数即是方法. Scala 中的方法跟 Java 的 ...

  6. [Scala]Scala学习笔记二 数组

    1. 定长数组 如果你需要一个长度不变的数组,可以使用Scala中的Array. val nums = new Array[Int](10) // 10个整数的数组 所有元素初始化为0 val str ...

  7. onethink入门笔记(二)

    5.onethink页面端获得后台服务器传值的方法 1:一般后台通过assign的值前台通过{$value}显示出来; 2:如果需要在js中使用 则可以通过 在js中写 var m = "{ ...

  8. OpenGLES入门笔记二

    #import <UIKit/UIKit.h> #import <QuartzCore/QuartzCore.h> #import <OpenGLES/ES2/gl.h& ...

  9. Redis入门笔记(二)-配置及运行

    转自: http://gly199.iteye.com/blog/1056424 1.redis基本参数 redis的配置文件中的常见参数如下: daemonize   是否以后台进程运行,默认为no ...

随机推荐

  1. Xcode7 免证书真机测试

    Xcode很早就有个免证书测试,今天我自己也测试了一把,还是挺好用的,接下来,我就说一下我的大体过程: 注意:一定要让你的真机设备的系统版本和app的系统版本想对应,如果不对应就会出现一个很常见的问题 ...

  2. 针对iOS10的各种问题的解决方法

    1.iOS10相册相机闪退bug: iOS10系统下调用系统相册,相机功能,遇到闪退的情况,描述如下: This app has crashed because it attempted to acc ...

  3. (三)Jquery Mobile按钮详细讲解

    Jquery Mobile按钮详细讲解 一.JM按钮说明 按钮如下图所示           1.HTML5中的button      效果:      2. JM中的普通button        ...

  4. 通过 File API 使用 JavaScript 读取文件

    原文地址:http://www.html5rocks.com/zh/tutorials/file/dndfiles/ 简介 HTML5 终于为我们提供了一种通过 File API 规范与本地文件交互的 ...

  5. 数据库ER图 PowerDesigner

    一.概念数据模型概述数据模型是现实世界中数据特征的抽象.数据模型应该满足三个方面的要求:1)能够比较真实地模拟现实世界2)容易为人所理解3)便于计算机实现 概念数据模型也称信息模型,它以实体-联系(E ...

  6. linux命令学习5-pssh命令

    pssh命令是一个python编写可以在多台服务器上执行命令的工具,同时支持拷贝文件,是同类工具中很出色的,类似pdsh,个人认为相对pdsh更为简便,使用必须在各个服务器上配置好密钥认证访问. 1. ...

  7. NSDateFormatter调整时间格式的代码

    NSDateFormatter调整时间格式的代码 在开发iOS程序时,有时候需要将时间格式调整成自己希望的格式,这个时候我们可以用NSDateFormatter类来处理.例如://实例化一个NSDat ...

  8. iOS开发笔记 - 界面调试神器Reveal

    http://blog.csdn.net/jackfrued/article/details/50934092     Reveal是iOS开发工具中的神器之一,它能够在应用程序运行过程中调试应用程序 ...

  9. HTML CSS基础(二)

    块元素和行内元素 HTML元素根据表现形式,可以分为2类: (1)块元素(block): (2)行内元素(inline): 任何HTML元素都属于这两类中的其中一类. 2.块元素特点: (1)独占一行 ...

  10. ecshop中ajax的调用原理 1

    ecshop中ajax的调用原理   1:首先ecshop是如何定义ajax对象的. ecshop中的ajax对象是在js/transport.js文件中定义的.里面是ajax对象文件.声明了一个va ...