Scala学习笔记

Scala学习笔记

Posted by bluesky blog on January 22, 2016

目录



函数式编程

因为Spark的原因,开始接触Scala编程。对于写惯了Java的我来说,Scala中很多语法是让人脑洞大开的。

整理了一些我刚开始疑惑的地方。

符号

其实使用符号,也相当于调用函数,以下为几个常用的符号使用

_ 占位符

顾名思义,占位符就是占位用的

scala> val someNumbers = List ( -11, -10, - 5, 0, 5, 10)
someNumbers: List[Int] = List(-11, -10, -5, 0, 5, 10)
scala> someNumbers.filter(_ >0)
res0: List[Int] = List(5, 10)

=>

多用于函数和方法体中,有Call by nameCall by need 两种

scala> val someNumbers = List ( -11, -10, - 5, 0, 5, 10)
someNumbers: List[Int] = List(-11, -10, -5, 0, 5, 10)
scala> someNumbers.foreach((x:Int) => println(x))
-11
-10
-5
0
5
10

两种参数传递的理解,详见:http://wiki.jikexueyuan.com/project/scala-development-guide/chuanming-parameters.html

<-

变量传递

scala> val myList = List(1,2,3,4,5)
myList: List[Int] = List(1, 2, 3, 4, 5)
	
scala> for(x:Int <- myList)  println(x)
1
2
3
4
5

->

连接两个元素,形成一个元组

scala> 1 -> 2
res0: (Int, Int) = (1,2)

声明Map时,

scala> Map("foo" -> "bar")
res12: scala.collection.immutable.Map[String,String] = Map(foo -> bar)

::

可以将两个List进行组合

scala> val a = List(1,2,3)
a: List[Int] = List(1, 2, 3)

scala> val b = List(4,5,6)
b: List[Int] = List(4, 5, 6)

scala> a :: b
res16: List[Any] = List(List(1, 2, 3), 4, 5, 6)

* 可变参数

如下echo方法,当参数个数不确定时,可以使用该功能。

scala> def echo (args: String *) =
|   for (arg <- args) println(arg)
echo: (args: String*)Unit

概念理解

隐式转换

隐式转换就是指编译器发现代码里缺失部分信息,然后自己去查找信息的过程。需要用implicit声明。示例如下:

声明一个函数,参数类型为String

scala> def test(str:String) = println(str)
test: (str: String)Unit

scala> test("hello")
hello

当参数类型不为String时,调用报错:

scala> test(1)
<console>:9: error: type mismatch;
 found   : Int(1)
 required: String
          test(1)

此时,可声明一个匿名函数解决该问题。

scala> implicit def intToString(str:Int)= str.toString
warning: there were 1 feature warning(s); re-run with -feature for details
intToString: (str: Int)String

scala> test(1)
1

需要注意的是,如果在同一个作用域,声明了两个相同参数和返回值的隐式转换函数,程序就不知道调用哪一个了,从而抛出异常。

函数和方法区别

在实践中,即使不理解方法和函数上的区别,你也可以用Scala做伟大的事情。如果你是Scala新手,而且在读两者的差异解释,你可能会跟不上。不过这并不意味着你在使用Scala上有麻烦。它只是意味着函数和方法之间的差异是很微妙的,只有深入语言内部才能清楚理解它。—引自《scala课堂》

样本类

使用样本类可以方便得存储和匹配类的内容。你不用new关键字就可以创建它们。

学习资源

入门:

《快学Scala》

Scala课堂: https://twitter.github.io/scala_school/zh_cn/

Scala 开发教程: http://wiki.jikexueyuan.com/project/scala-development-guide/

进阶:

《深入理解Scala》