Scala学习笔记

笔记内容比较杂!

1.Scala中的单例对象使用object修饰,类似于C++中的静态类。调用其内部函数时,直接使用对象名调用,不能用new申请!

2.一个文件中可以定义名称相同的类和单例对象,单例对象被称作是类的伴生对象(Companion Object)。二者可以相互访问彼此的私有成员。伴生对象可以理解为是相同名称的类的静态成员函数。

3.Scala文件名不需要与类名相同。但是最好是一样的,方便维护、编程。

4.定义一个变量时,一定要以val或var修饰:
var hw =new helloworld("Hi,my name is lming_08")

var表示变量,val表示常量


Scala会自动判别类型为helloworld型,当然也可以指定类型。
var hw:helloworld =new helloworld("Hi,my name is lming_08")

5.定义一个方法
scala> def max(x: Int, y: Int): Int = if (x < y) y else x
max: (Int,Int)Int
冒号后面的Int是结果类型,如果定义的方法是递归型的,那么就必须显示地指定方法的结果类型。普通的方法,编译器是可以推测出结果类型的。注意:参数类型是必须显示地指定。当方法体涉及到多条语句时,你需要用{}括起来。

函数内部定义函数:
// 函数内部定义函数
  def squreInc(x : Int) = {
    def squre(a : Int) = a * a
    squre(x) + 1
  }
或者定义匿名函数
// 函数内部定义匿名函数
  def squreInc2(x : Int) = {
    val squre = (a : Int) => a * a
    squre(x) + 1
  }

话说匿名函数与python中的lambda表达式是惊人的相似!
>>> func = lambda x : x + 1
>>> func(1)
2


如果一个函数是不带参数的,那么  在定义时 可以(或不可以)去掉括号, 执行时去掉括号
scala> def func = 1+2
func: Int

scala> func
res0: Int = 3




6.循环的使用
def arrLoop(arr:Array[String])={
    arr(0)="abc"
    arr(1)="123"
    arr(2)="ABC"
    for(elem<- arr)
      println(elem+", hello")
  }
  def arrLoop2(arr:Array[String])={
    arr(0)="+abc"
    arr(1)="+123"
    arr(2)="+ABC"
    arr.foreach(elem => println(elem))
  }
  def arrLoop3(arr:Array[String])={
    arr(0)="-abc"
    arr(1)="-123"
    arr(2)="-ABC"
    for(i <- 0 to arr.length -1){
      println(arr(i))
    }
  }
针对第三种下标for循环,除了to还有until, 表示[0, arr.length-2]

7.Array和List区别
Array是一个可变对象的序列,在实例化后不能更改Array的长度,但是可以改变其元素的值;
而List是不可变对象的序列,更加面向函数式;Scala List与Java List(java.util.List)也是不同的,Scala List是不可变的,而Java List是可变的。更重要的是,Scala List更加的面向函数式编程。
val oneTwoThree = List(1, 2, 3)


/**************************************************************

 * 时隔一年之后再次踏上学习Scala之路 2015.08.30 22:33

 **************************************************************/

8. Scala中能不用var变量就不用!

原因是Scala是为并发编程而生,为函数式编程而生,所以对于Scala程序员最好使用val变量。

一些取代var变量的例子:

1)原代码

 var filename = "default.txt"
  if (!args.isEmpty)
    filename = args(0)
取代后的代码

val filename =
      if (!args.isEmpty) args(0)
      else "default.txt"

2)


9.while 和do while被称作循环,而不是表达式

scala> def greet() { println("hi") }
  greet: ()Unit
  
  scala> greet() == ()                                  
  hi
  res0: Boolean = true

def greet() : Unit = { println("hi") }
def greet()  = { println("hi") }


一定要注意这里的返回值!千万不要写出下面的代码:

var line = ""
  while ((line = readLine()) != ""// This doesn't work!
    println("Read: "+ line)

10.集合操作

http://www.artima.com/pins1ed/collections.html


scala> val jetSet = Set("Boeing", "Airbus")
jetSet: scala.collection.immutable.Set[String] = Set(Boeing, Airbus)

scala> jetSet += "Lear"
<console>:12: error: value += is not a member of scala.collection.immutable.Set[String]
       jetSet += "Lear"

从这里可以清楚的看到 += 不是immutable的成员,然而件val换成var却又不报错了,why?

这是因为换成var后, += 会生成一个新的Set, 等价于

var y = jetSet
y += "Lear"

对于Set,+会生成一个新的Set,因为类型是var, 所以会指向一个新的对象新的地址, 而val类型是不会重新指向新地址的。

http://stackoverflow.com/questions/5074179/val-or-var-mutable-or-immutable


未完待续。。。


参考资料:http://www.artima.com/scalazine/articles/steps.html

                  github练习代码

你可能感兴趣的:(scala)