- Introduce
Scala上一门纯面向对象的函数式编程语言,其主要贡献以及备受欢迎大概是因为其是Spark的开发语言(个人观点)。
1.Scala 语言具有一下特性:
2.语法基础:
Scala:执行可以是交互模式,亦可脚本模式
语法:
3.关键字
abstract | case | catch | class |
def | do | else | extends |
false | final | finally | for |
forSome | if | implicit | import |
lazy | match | new | Null |
object | override | package | private |
protected | return | sealed | super |
this | throw | trait | Try |
true | type | val | Var |
while | with | yield | |
- | : | = | => |
<- | <: | <% | >: |
# | @ |
序号 | 数据类型 | 说明 |
1 | Byte | 8位有符号值,范围从-128至127 |
2 | Short | 16位有符号值,范围从-32768至32767 |
3 | Int | 32位有符号值,范围从-2147483648至2147483647 |
4 | Long | 64位有符号值,范围从-9223372036854775808至9223372036854775807 |
5 | Float | 32位IEEE 754单精度浮点值 |
6 | Double | 64位IEEE 754双精度浮点值 |
7 | Char | 16位无符号Unicode字符。范围从U+0000到U+FFFF |
8 | String | 一个Char类型序列 |
9 | Boolean | 文字值true或文字值false |
10 | Unit | 对应于无值 |
11 | Null | null或空引用 |
12 | Nothing | 每种其他类型的亚型; 不包括无值 |
13 | Any | 任何类型的超类型; 任何对象的类型为Any |
14 | AnyRef | 任何引用类型的超类型 |
4.变量以及定义形式:
注:当为变量分配初始值时,Scala编译器可以根据分配给它的值来推断变量的类型。这被称为变量类型推断。因此,可以编写这样的变量声明
5.循环语句
注:break并不像c++,Java一样,在Scala中break是一个类,下文会有code实例。
6. if...else
define:
// _1
if(判断条件){
// code block
}
// _2
if(判断条件){
// code block
}else{
// code block
}
//_3
if(判断条件_1){
// code block
}else if(判断条件_2){
// code block
}else if(判断条件_3){
}else{
}
7.函数
deffunctionName([listof parameters]):[returntype]
•Scala为调用方法提供了许多句法变体。以下是调用方法的标准方法 -
functionName( listof parameters )Scala
[instance.]functionName( listof parameters )
Scala函数是Scala编程的核心,因此Scala被认为是函数式编程语言。以下是与Scala函数相关的几个重要概念,Scala程序员应该要理解。(各类函数实例见下文code)
序号 | 函数 |
1 | 按名称调用函数(将代码块传递给调用,奉调即算) |
2 | |
3 | 可变参数的函数(最后一个参数可重复) |
4 | 递归函数(一般思考尾递归方式解决栈溢出问题) |
5 | |
6 | 高阶函数(将其他函数作为参数或其结果是函数的函数) |
7 | |
8 | |
9 | |
10 |
8.闭包
闭包是一个函数,返回值依赖于声明在函数外部的一个或多个变量。
闭包通常来讲可以简单的认为是可以访问一个函数里面局部变量的另外一个函数。
9.字符串,数组,集合
10. 类和对象
11.Scala Trait(特征)
trait Equal { def isEqual(x: Any): Boolean def isNotEqual(x: Any): Boolean = !isEqual(x) }
12. I/O
1.使用Java的IO进行文件读写
Scala可以使用任何Java对象,而java.io.File
是Scala编程中可用于读取和写入文件的对象之一。
2.读取命令行输入:使用Console类
val line = Console.readLine
3.读取文件内容:
scala.io.Source
for example:
// 读取文件并按行输出
Source.fromFile("Demo.txt" ).foreach(println)
13. 异常处理
Scala 的异常处理和其它语言比如 Java 类似。
Scala 的方法可以通过抛出异常的方法的方式来终止相关代码的运行,不必通过返回值。
抛出异常: throw
捕获异常:
异常捕捉的机制与其他语言中一样,如果有异常发生,catch字句是按次序捕捉的。因此,在catch字句中,越具体的异常越要靠前,越普遍的异常越靠后。 如果抛出的异常不在catch字句中,该异常则无法处理,会被升级到调用者处。
捕捉异常的catch子句,语法与其他语言中不太一样。在Scala里,借用了模式匹配的思想来做异常的匹配,因此,在catch的代码里,是一系列case字句。
下面针对以上介绍的方面实际操作实现code如下:
package com.test import java.io._ import scala.util.control._ import java.util.Date import scala.io.Source object ForExample { def addInt(a: Int, b: Int): Int = { var sum: Int = 0 sum = a + b return sum } // 按名调用函数实例 def time() = { println("Getting time in nano seconds") System.nanoTime } def delayed(t: => Long) = { println("In delayed method") println("Param: " + t) } // 命名参数的函数 def printInt(a: Int, b: Int) = { println("Value of a : " + a); println("Value of b : " + b); } // 可变参数的函数 def printStrings(args: String*) = { var i: Int = 0; for (arg <- args) { println("Arg value[" + i + "] = " + arg); i = i + 1; } } // 递归函数 def factorial(n: BigInt): BigInt = { if (n <= 1) n else factorial(n - 1) + n } // 尾递归函数 def factorial_add(n: BigInt, result: BigInt): BigInt = { if (n <= 0) result else factorial_add(n - 1, result + n) } def addInt_1(a: Int = 5, b: Int = 7): Int = { var sum: Int = 0 sum = a + b return sum } // 以函数作为参数 def apply(f: Int => String, v: Int) = f(v) // 以函数 def layout[A](x: A) = "[" + x.toString() + "]" // 匿名函数 val numtiply = (x: Int, y: Int) => x * y // 部分应用函数 def log(date: Date, message: String) = { println(date + "------" + message) } // 柯里化函数 def addCurrying(a: Int)(b: Int) = { a + b } // 嵌套函数 def factorial_addtion(i: Int): Int = { def fact_add(i: Int, accumulator: Int): Int = { if (i <= 1) accumulator else fact_add(i - 1, i + accumulator) } fact_add(i, 1) } // 模式匹配 def matchTest(x: Int): String = x match { case 1 => "one" case 2 => "two" case _ => "many" } // 异常处理 def exceptionTest(args: String*): Unit = { try { val f = new FileReader("input.txt") } catch { case ex: FileNotFoundException => { println("Missing file exception") } case ex: IOException => { println("IO Exception") } } finally { println("Exiting finally...") } } // 文件读写 def fileReadAndWriter(input: String,output: String): Unit ={ try{ val file_data = new PrintWriter(new File(output)) val file_in = Source.fromFile(input) file_in.foreach(file_data.write) } catch { case ex: FileNotFoundException => { println("Missing file exception") } case ex: IOException => { println("IO Exception") } } finally { println("Read file and Write file finished") } } // 计算 def main(args: Array[String]) { var a = 0; val numList = List(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); val loop = new Breaks; loop.breakable { for (a <- numList) { println("Value of a: " + addInt_1(a)); if (a == 4) { loop.break; } } } println("After the loop"); delayed(time()) delayed(time()) printInt(a = numList(0), b = numList(1)) printInt(b = numList(0), a = numList(1)) val stringList = List("scala", "spark", "c++", "hadoop", "Linux", "kalfka", "python", "tensorflow", "spark-mlib", "Mesos"); printStrings("scala", "spark", "c++") println("匿名函数:" + numtiply(4, 6)) // 部分应用 val date = new Date() val logWithMess = log(date, _: String) logWithMess("message_1") Thread.sleep(1000) logWithMess("messgae_2") Thread.sleep(1000) logWithMess("message_3") Thread.sleep(1000) println(matchTest(1)) println(matchTest(2)) println(matchTest(3)) exceptionTest("fas") } }