Scala语法笔记
JAVA中,举例你S是一个字符串,那么s(i)就是该字符串的第i个字符(s.charAt(i)).Scala中使用apply的方法
JAVA与C++的?:操作符 等同于Scala的
if ( x > 0) 1 else -1
x>0 ? 1: -1 //JAVA或C++
在Scala中,每个表达式都有一个类型,如下:
if ( x > 0) "positive" else -1
其中一个分支是java.lang.String 而另一个分支是Int,他们的公共超类型是Any
使用如下会报错:
if(x > 0) 1 else if( x == 0) 0 else -1
改为
if(x > 0){ 1 }else if (x== 0) 0 else -1
高级for 循环 可以使用变量<- 表达式 的形式提供多个生成器,用分号将其隔开
如果for循环的循环体以yield开始,则循环会构造出一个结合,每次迭代生成集合中的一值:
每个生成器都自带一个守卫,以if开头的Boolean表达式
可以任意多的定义,引入可以在循环中使用变量
定义函数:Scala一般不需要声明返回值类型,会自己推断,但使用递归的时候 必须指定返回类型:
默认参数和带名参数(什么鬼,Java的思想被颠覆)
过程,Scala对于不返回值的函数有特殊的表示语法,如果函数体包含在花括号中但没有前面的=号,那么返回类型就是Unit
或def box(s : String) : Unit = { ...} 显示声明Unit返回类型
数组:
声明一个空的数组缓冲,用+=在尾端添加元素,用()而不是用{} 移除用trimEnd
也可在任意位置插入或移除元素 其中remove方法第二个参数为要删除多少个
遍历数组 使用的是until ,它属于RichInt类的方法,返回所有小于(但不包括)上限的数字。
常用算法
使用sum方法,元素类型必须是数值类型,要么是整型,要么是浮点型或者integer,decimal
sorted方法将数组或数组缓冲排序并返回经过排序的数组或数组缓冲
val b = ArrayBuffer(1, 7, 2, 9)
val bSorted = b.sorted(_ < _)
如果要显示数组或数组缓冲的内容,可以用mkString方法,它允许你指定元素之间的分隔符。toString返回的值就无意义了
使用List 使用:: 把一个新元素组合到已有List的最前端,然后返回结果List
使用元组Tuple:
与列表一样,元组也是不可变的,但与列表不同,元组可以包含不同类型的元素。而列表应该是List[Int]或List[String]的样子,元组可以同时拥有Int和String。元组很有用,比方说,如果你需要在方法里返回多个对象。Java里你将经常创建一个JavaBean样子的类去装多个返回值,Scala里你可以简单地返回一个元组。而且这么做的确简单:实例化一个装有一些对象的新元组,只要把这些对象放在括号里,并用逗号分隔即可。一旦你已经实例化了一个元组,你可以用点号,下划线和一个基于1的元素索引访问它.
使用Set和Map
创建,初始化和使用可变集合
Map是Scala里另一种有用的集合类。和集一样,Scala采用了类继承机制提供了可变的和不可变的两种版本的Map,,Map的类继承机制看上去和Set的很像。scala.collection包里面有一个基础Map特质和两个子特质Map:可变的Map在scala.collection.mutable里,不可变的在scala.collection.immutable里。
函数式风格:
import scala.collection.mutable.Map
更函数式的方式应该是定义对需打印的arg进行格式化的方法,但是仅返回格式化之后的字串
集合类型的filter方法
val a = List(-11,-10,-5,0,5,10)
someNumber.foreach((x:Int) =>println(x))
someNumber.filter((x:Int) => x>0)
结果:res6: List[Int] = List(5,10)
短格式:
someNumbers.filter((x) => x>0)
结果:res7: List[Int] = List(5,10)
占位符语法:如果想让函数文本更简洁,可以把下划线当做一个或更多参数的占位符,只要每个参数在函数文本内仅出现一次。比如,_ > 0对于检查值是否大于零的函数来说就是非常短的标注:
someNumbers.filter(_>0)
你可以把下划线看作表达式里需要被“填入”的“空白”。这个空白在每次函数被调用的时候用函数的参数填入。例如,由于someNumbers在第115页被初始化为值List(-11, -10, -5, 0, 5, 10),filter方法会把_ > 0里的空格首先用-11替换,就如-11 > 0,然后用-10替换,如-10 > 0,然后用-5,如-5 > 0,这样直到List的最后一个值。因此,函数文本_ > 0与稍微冗长一点儿的x => x > 0相同
使用冒号指定类型:
val f = (_: Int) + (_ : Int)
f(5,10)
偏应用函数
someNumbers.foreach(println _)
Scala把这种短格式直接看作是你输入了下列代码:
someNumbers.foreach(x => println(x))
闭包:不带自由变量的函数文本,如(x: Int) => x + 1,被称为封闭术语:closed term,这里术语:term指的是一小部分源代码。因此依照这个函数文本在运行时创建的函数值严格意义上来讲就不是闭包,因为(x: Int) => x + 1在编写的时候就已经封闭了。但任何带有自由变量的函数文本,如(x: Int) => x + more,都是开放术语:open term。因此,任何依照(x: Int) => x + more在运行期创建的函数值将必须捕获它的自由变量,more,的绑定。由于函数值是关闭这个开放术语(x: Int) => x + more的行动的最终产物,得到的函数值将包含一个指向捕获的more变量的参考,因此被称为闭包。
直觉上,Scala的闭包捕获了变量本身,而不是变量指向的值
重复参数
Scala允许你指明函数的最后一个参数可以是重复的。这可以允许客户向函数传入可变长度参数列表。想要标注一个重复参数,在参数的类型之后放一个星号
函数内部,重复参数的类型是声明参数类型的数组。因此,echo函数里被声明为类型“String*”的args的类型实际上是Array[String]。然而,如果你有一个合适类型的数组,并尝试把它当作重复参数传入会出错