Scala语法篇
Scala根底篇
数据类型
下表中列出的数据类型都是方针,能够直接对它们调用办法。
数据类型 | 描绘 |
---|---|
Byte | 8位有符号补码整数。数值区间为 -128 到 127 |
Short | 16位有符号补码整数。数值区间为 -32768 到 32767 |
Int | 32位有符号补码整数。数值区间为 -2147483648 到 2147483647 |
Long | 64位有符号补码整数。数值区间为 -9223372036854775808 到 9223372036854775807 |
Float | 32 位, IEEE 754 规范的单精度浮点数 |
Double | 64 位 IEEE 754 规范的双精度浮点数 |
Char | 16位无符号Unicode字符, 区间值为 U+0000 到 U+FFFF |
String | 字符序列 |
Boolean | true或false |
Unit | 表明无值,和其他言语中void同等。用作不回来任何成果的办法的成果类型。Unit只要一个实例值,写成()。 |
Null | null 或空引证 |
Nothing | Nothing类型在Scala的类层级的最底端;它是任何其他类型的子类型。 |
Any | Any是一切其他类的超类 |
AnyRef | AnyRef类是Scala里一切引证类(reference class)的基类 |
表明Long类型,在数字后边增加L或许l作为后缀;浮点数后边有f或许F后缀时,表明Float类型,不然便是Double
变量
用关键词“var”声明变量,关键词"val"声明常量。
var myName : String = "gyt"
val myAge : Int = 21
scala中纷歧定要指明数据类型,其数据类型通过变量或常量的初始值揣度出来的,因而,在没有指明数据类型的情况下,有必要要给出初始值。
拜访润饰符
用private关键词润饰,只能被当时类以及当时类的内部类拜访到,外层类拜访不到。
class Outer{
class Inner{
private def f(){
println("f")
}
class InnerMost{
f() // 正确
}
}
(new Inner).f() //过错
}
用protected关键词润饰,只能被当时类的子类拜访。
package p {
class Super {
protected def f() {println("f")}
}
class Sub extends Super {
f()
}
class Other {
(new Super).f() //过错
}
}
没有指定任何润饰符,默许为public,在任何地方都能够被拜访。
条件和循环
以下是IF...ELSE句子实例。
object Test {
def main(args: Array[String]) {
var x = 30;
if( x == 10 ){
println("X 的值为 10");
}else if( x == 20 ){
println("X 的值为 20");
}else if( x == 30 ){
println("X 的值为 30");
}else{
println("无法判别 X 的值");
}
}
}
以下是一个运用了 i to j 语法(包括 j)的实例,箭头 <- 用于为变量 a 赋值。
object Test {
def main(args: Array[String]) {
var a = 0;
// for 循环
for( a <- 1 to 10){
println( "Value of a: " + a );
}
}
}
在 for 循环 中你能够运用分号;来设置多个区间,它将迭代给定区间一切的或许值。
object Test {
def main(args: Array[String]) {
var a = 0;
var b = 0;
// for 循环
for( a <- 1 to 3; b <- 1 to 3){
println( "Value of a: " + a );
println( "Value of b: " + b );
}
}
}
for 循环调集的语法如下。
object Test {
def main(args: Array[String]) {
var a = 0;
val numList = List(1,2,3,4,5,6);
// for 循环
for( a <- numList ){
println( "Value of a: " + a );
}
}
}
你能够将 for 循环的回来值作为一个变量存储。
object Test {
def main(args: Array[String]) {
var a = 0;
val numList = List(1,2,3,4,5,6,7,8,9,10);
// for 循环
var retVal = for{ a <- numList
if a != 3; if a < 8
}yield a
// 输出回来值
for( a <- retVal){
println( "Value of a: " + a );
}
}
}
函数式编程(要点)
函数式编程:关于相同的输入永久会得到相同的输出,而且没有任何能够调查的副作用,也不依赖外部的环境状况。参阅什么是函数式编程?。
Scala中函数是为完结某一功用的程序句子的调集,类中界说的函数称之为办法。下面是办法的一个实例。
object add{
def addInt( a:Int, b:Int ) : Int = {
var sum:Int = 0
sum = a + b
return sum
}
}
可变参数:咱们不需要指定函数参数的个数,能够向函数传入可变长度参数列表。通过在参数的类型之后放一个星号来设置可变参数(可重复的参数)。
object Test {
def main(args: Array[String]) {
printStrings("Runoob", "Scala", "Python");
}
def printStrings( args:String* ) = {
var i : Int = 0;
for( arg <- args ){
println("Arg value[" + i + "] = " + arg );
i = i + 1;
}
}
}
默许参数: scala能够为函数参数指定默许参数值,运用了默许参数,你在调用函数的进程中能够不需要传递参数,这时函数就会调用它的默许参数值,假如传递了参数,则传递值会替代默许值。
object Test {
def main(args: Array[String]) {
println( "回来值 : " + addInt() );
}
def addInt( a:Int=5, b:Int=7 ) : Int = {
var sum:Int = 0
sum = a + b
return sum
}
}
匿名函数:箭头左面是参数列表,右边是函数体。
var inc = (x: Int) => {x+1}
var x = inc(7) - 1
//界说一个函数,以函数作为参数输入
def f(func: String => Unit): Unit = {
func("gyt")
}
var fun = (name: String) => {println(name)}
f(fun)
传名调用:传递的不是详细的值,而是代码块。和一般的传值调用比较,每次运用传名调用时,解说器都会核算一次表达式的值。
def f1(): Int = {
println("f1被调用")
12
}
def f2(a: => Int): Unit = {
println(a)
println(a)
}
f2(f1())
至简准则:
(1)函数中的return能够省掉,以最终一行代码作为代码块的回来值。
def f1(name: String): String = {
name
}
(2)假如函数体只要一行代码,能够省掉花括号。
def f2(name: String): String = name
(3)假如编译器能够揣度出来回来值,那么能够省掉(:和回来值类型一同省掉)。有意思的是,到这一步,scala函数的办法形如数学中的f(x) = y。
def f3(name: String) = name
(4)假如有return,则(3)不适用。
(5)假如回来值是Unit,能够省掉等号和回来值,可是此刻花括号不能省掉。
def f4(name: String) {
println(name)
}
(6)假如函数没有参数,那么调用它的时分能够直接用函数名。不必加“()”。
闭包:假如一个函数,拜访到它的外部(部分)变量的值,那么这个函数和它所在的环境,称为闭包。
柯里化:将本来承受两个参数的函数变成新的承受一个参数的函数的进程。新的函数回来一个以原有第二个参数为参数的函数。
object Test {
def main(args: Array[String]) {
val str1:String = "Hello, "
val str2:String = "Scala!"
println( "str1 + str2 = " + strcat(str1)(str2) )
}
def strcat(s1: String)(s2: String) = {
s1 + s2
}
}
字符串
在 Scala 中,字符串的类型实际上是 Java String,它自身没有 String 类。
序号 | 办法及描绘 |
---|---|
1 | char charAt(int index)回来指定方位的字符 |
2 | int compareTo(Object o)比较字符串与方针 |
3 | int compareTo(String anotherString)按字典次序比较两个字符串 |
4 | int compareToIgnoreCase(String str)按字典次序比较两个字符串,不考虑巨细写 |
5 | String concat(String str)将指定字符串衔接到此字符串的完毕 |
6 | boolean contentEquals(StringBuffer sb)将此字符串与指定的 StringBuffer 比较。 |
7 | static String copyValueOf(char[] data)回来指定数组中表明该字符序列的 String |
8 | static String copyValueOf(char[] data, int offset, int count)回来指定数组中表明该字符序列的 String |
9 | boolean endsWith(String suffix)测验此字符串是否以指定的后缀完毕 |
10 | boolean equals(Object anObject)将此字符串与指定的方针比较 |
11 | boolean equalsIgnoreCase(String anotherString)将此 String 与另一个 String 比较,不考虑巨细写 |
12 | byte getBytes()运用渠道的默许字符集将此 String 编码为 byte 序列,并将成果存储到一个新的 byte 数组中 |
13 | byte[] getBytes(String charsetName运用指定的字符集将此 String 编码为 byte 序列,并将成果存储到一个新的 byte 数组中 |
14 | void getChars(int srcBegin, int srcEnd, char[] dst, int dstBegin)将字符从此字符串复制到方针字符数组 |
15 | int hashCode()回来此字符串的哈希码 |
16 | int indexOf(int ch)回来指定字符在此字符串中榜首次呈现处的索引 |
17 | int indexOf(int ch, int fromIndex)回来在此字符串中榜首次呈现指定字符处的索引,从指定的索引开端查找 |
18 | int indexOf(String str)回来指定子字符串在此字符串中榜首次呈现处的索引 |
19 | int indexOf(String str, int fromIndex)回来指定子字符串在此字符串中榜首次呈现处的索引,从指定的索引开端 |
20 | String intern()回来字符串方针的规范化表明办法 |
21 | int lastIndexOf(int ch)回来指定字符在此字符串中最终一次呈现处的索引 |
22 | int lastIndexOf(int ch, int fromIndex)回来指定字符在此字符串中最终一次呈现处的索引,从指定的索引处开端进行反向查找 |
23 | int lastIndexOf(String str)回来指定子字符串在此字符串中最右边呈现处的索引 |
24 | int lastIndexOf(String str, int fromIndex)回来指定子字符串在此字符串中最终一次呈现处的索引,从指定的索引开端反向查找 |
25 | int length()回来此字符串的长度 |
26 | boolean matches(String regex)奉告此字符串是否匹配给定的正则表达式 |
27 | boolean regionMatches(boolean ignoreCase, int toffset, String other, int ooffset, int len)测验两个字符串区域是否持平 |
28 | boolean regionMatches(int toffset, String other, int ooffset, int len)测验两个字符串区域是否持平 |
29 | String replace(char oldChar, char newChar)回来一个新的字符串,它是通过用 newChar 替换此字符串中呈现的一切 oldChar 得到的 |
30 | String replaceAll(String regex, String replacement运用给定的 replacement 替换此字符串一切匹配给定的正则表达式的子字符串 |
31 | String replaceFirst(String regex, String replacement)运用给定的 replacement 替换此字符串匹配给定的正则表达式的榜首个子字符串 |
32 | String[] split(String regex)依据给定正则表达式的匹配拆分此字符串 |
33 | String[] split(String regex, int limit)依据匹配给定的正则表达式来拆分此字符串 |
34 | boolean startsWith(String prefix)测验此字符串是否以指定的前缀开端 |
35 | boolean startsWith(String prefix, int toffset)测验此字符串从指定索引开端的子字符串是否以指定前缀开端。 |
36 | CharSequence subSequence(int beginIndex, int endIndex)回来一个新的字符序列,它是此序列的一个子序列 |
37 | String substring(int beginIndex)回来一个新的字符串,它是此字符串的一个子字符串 |
38 | String substring(int beginIndex, int endIndex)回来一个新字符串,它是此字符串的一个子字符串 |
39 | char[] toCharArray()将此字符串转换为一个新的字符数组 |
40 | String toLowerCase()运用默许言语环境的规矩将此 String 中的一切字符都转换为小写 |
41 | String toLowerCase(Locale locale)运用给定 Locale 的规矩将此 String 中的一切字符都转换为小写 |
42 | String toString()回来此方针自身(它已经是一个字符串!) |
43 | String toUpperCase()运用默许言语环境的规矩将此 String 中的一切字符都转换为大写 |
44 | String toUpperCase(Locale locale)运用给定 Locale 的规矩将此 String 中的一切字符都转换为大写 |
45 | String trim()删去指定字符串的首尾空白符 |
46 | static String valueOf(primitive data type x)回来指定类型参数的字符串表明办法 |
数组
Scala 言语中供给的数组是用来存储固定巨细的同类型元素。下面是声明数组的三种办法。
var z:Array[String] = new Array[String](3)
var zz = new Array[String](3)
var zzz = Array("Runoob", "Baidu", "Google")
形式匹配
一个形式匹配包括了一系列备选项,每个都开端于关键字 case。每个备选项都包括了一个形式及一到多个表达式。箭头符号 => 隔开了形式和表达式。
object Test {
def main(args: Array[String]) {
println(matchTest("two"))
println(matchTest("test"))
println(matchTest(1))
println(matchTest(6))
}
def matchTest(x: Any): Any = x match {
case 1 => "one"
case "two" => 2
case y: Int => "scala.Int"
case _ => "many"
}
}
实例中榜首个 case 对应整型数值 1,第二个 case 对应字符串值 two,第三个 case 对应类型形式,用于判别传入的值是否为整型,比较运用isInstanceOf来判别类型,运用形式匹配更好。第四个 case 表明默许的全匹配备选项,即没有找到其他匹配时的匹配项,相似 switch 中的 default。
object Test {
def main(args: Array[String]) {
val alice = new Person("Alice", 25)
val bob = new Person("Bob", 32)
val charlie = new Person("Charlie", 32)
for (person <- List(alice, bob, charlie)) {
person match {
case Person("Alice", 25) => println("Hi Alice!")
case Person("Bob", 32) => println("Hi Bob!")
case Person(name, age) =>
println("Age: " + age + " year, name: " + name + "?")
}
}
}
// 样例类
case class Person(name: String, age: Int)
}
运用了case关键字的类界说便是样例类(case classes),样例类是种特别的类,通过优化以用于形式匹配。
迭代器
Scala Iterator(迭代器)不是一个调集,它是一种用于拜访调集的办法。迭代器 it 的两个根本操作是 next 和 hasNext。调用 it.next() 会回来迭代器的下一个元素,而且更新迭代器的状况。调用 it.hasNext() 用于检测调集中是否还有元素。让迭代器 it 逐一回来一切元素最简略的办法是运用 while 循环:
object Test {
def main(args: Array[String]) {
val it = Iterator("Baidu", "Google", "Runoob", "Taobao")
while (it.hasNext){
println(it.next())
}
}
}
下表列出了Scala Iterator常用的办法:
序号 | 办法及描绘 |
---|---|
1 | def hasNext: Boolean假如还有可回来的元素,回来true。 |
2 | def next(): A回来迭代器的下一个元素,而且更新迭代器的状况 |
3 | def ++(that: => Iterator[A]): Iterator[A]兼并两个迭代器 |
4 | def ++[B >: A](that :=> GenTraversableOnce[B]): Iterator[B]兼并两个迭代器 |
5 | def addString(b: StringBuilder): StringBuilder增加一个字符串到 StringBuilder b |
6 | def addString(b: StringBuilder, sep: String): StringBuilder增加一个字符串到 StringBuilder b,并指定分隔符 |
7 | def buffered: BufferedIterator[A]迭代器都转换成 BufferedIterator |
8 | def contains(elem: Any): Boolean检测迭代器中是否包括指定元素 |
9 | def copyToArray(xs: Array[A], start: Int, len: Int): Unit将迭代器中选定的值传给数组 |
10 | def count(p: (A) => Boolean): Int回来迭代器元素中满意条件p的元素总数。 |
11 | def drop(n: Int): Iterator[A]回来丢掉前n个元素新调集 |
12 | def dropWhile(p: (A) => Boolean): Iterator[A]从左向右丢掉元素,直到条件p不成立 |
13 | def duplicate: (Iterator[A], Iterator[A])生成两个能别离回来迭代器一切元素的迭代器。 |
14 | def exists(p: (A) => Boolean): Boolean回来一个布尔值,指明迭代器元素中是否存在满意p的元素。 |
15 | def filter(p: (A) => Boolean): Iterator[A]回来一个新迭代器 ,指向迭代器元素中一切满意条件p的元素。 |
16 | def filterNot(p: (A) => Boolean): Iterator[A]回来一个迭代器,指向迭代器元素中不满意条件p的元素。 |
17 | def find(p: (A) => Boolean): Option[A]回来榜首个满意p的元素或None。留意:假如找到满意条件的元素,迭代器会被置于该元素之后;假如没有找到,会被置于结尾。 |
18 | def flatMap[B](f: (A) => GenTraversableOnce[B]): Iterator[B]针对迭代器的序列中的每个元素使用函数f,并回来指向成果序列的迭代器。 |
19 | def forall(p: (A) => Boolean): Boolean回来一个布尔值,指明 it 所指元素是否都满意p。 |
20 | def foreach(f: (A) => Unit): Unit在迭代器回来的每个元素上履行指定的程序 f |
21 | def hasDefiniteSize: Boolean假如迭代器的元素个数有限则回来 true(默许同等于 isEmpty) |
22 | def indexOf(elem: B): Int回来迭代器的元素中index等于x的榜首个元素。留意:迭代器会跳过这个元素。 |
23 | def indexWhere(p: (A) => Boolean): Int回来迭代器的元素中下标满意条件p的元素。留意:迭代器会跳过这个元素。 |
24 | def isEmpty: Boolean查看it是否为空, 为空回来 true,不然回来false(与hasNext相反)。 |
25 | def isTraversableAgain: BooleanTests whether this Iterator can be repeatedly traversed. |
26 | def length: Int回来迭代器元素的数量。 |
27 | def map[B](f: (A) => B): Iterator[B]将 it 中的每个元素传入函数 f 后的成果生成新的迭代器。 |
28 | def max: A回来迭代器迭代器元素中最大的元素。 |
29 | def min: A回来迭代器迭代器元素中最小的元素。 |
30 | def mkString: String将迭代器一切元素转换成字符串。 |
31 | def mkString(sep: String): String将迭代器一切元素转换成字符串,并指定分隔符。 |
32 | def nonEmpty: Boolean查看容器中是否包括元素(相当于 hasNext)。 |
33 | def padTo(len: Int, elem: A): Iterator[A]首要回来迭代器一切元素,追加复制 el |